3

我有一个TabActivity举办其他三项活动的活动。

如果选择了第一个选项卡,我可以更改设备方向,一切正常。

如果我转到第二个或第三个选项卡并更改方向,则选项卡子活动的(第二个和第三个)onCreate()方法会被调用两次,第一次是设置默认选项卡内容(第一个),然后是第二个 onCreate,正在设置选定的选项卡内容(第一次应该如此)。

为什么onCreate()方法被调用两次,我该如何解决这个问题?

编辑:

我不想android:configChanges="orientation"在清单中使用,因为我想让应用程序标题和系统栏向下并纵向显示它们,这只有在设置内容之前才有可能......

4

3 回答 3

1

使用android:configChanges="orientation"清单文件中的属性,如下所示

<activity android:name=".Settings" android:screenOrientation="portrait"
            android:configChanges="orientation"></activity>
于 2011-11-04T13:38:52.350 回答
1

只是为了让我清楚,您是说您有几个选项卡,它们使用不同的方向(纵向或横向),并且在切换选项卡和正确设置相应的方向时遇到问题?

回应 Cata 的评论:

是的,所以每当您旋转屏幕时,当前可查看的活动都会被破坏并再次调用 onCreate(如果我记得这些步骤)。您需要做的是调用 getCurrentTab(),它返回代表选项卡的 int 值,并在调用 onCreate 时将其重置为活动选项卡。您可以通过多种方式执行此操作...通过使用处理该问题的小方法并通过 onCreate 调用它,或者使用 onSaveInstanceState(Bundle) 保存当前数据,并使用 onRestoreInstanceState() 重新加载选项卡数据。

您可以设置一个全局 int (int currentTab = 0),而不是在 onCreate() 中设置,在 onSaveInstanceState(Bundle) 方法中,您可以将其保存到当前选项卡 (currentTab = getCurrentTab()),然后在 onRestoreInstanceState()你可以重新设置。

那有意义吗?

请记住,我没有对此进行测试,但如果您不熟悉这两个方法调用,则愿意这样做。

下面是一个将数据保存到 Bundle 的示例 - 还记得 onCreate 接受该活动包作为参数。

@Override
public void onSaveInstanceState(Bundle outState){
    // Store UI state to the savedInstanceState.
    // This bundle will be passed to onCreate on next call.
    super.onSaveInstanceState(outState);
    String strMinSec = timer.getText().toString();
    String strMs = timerMs.getText().toString();
    long curElapstedTime = elapsedTime;
    boolean timerStopped = stopped;
    int orientation = this.getResources().getConfiguration().orientation;

    outState.putString("MinSec", strMinSec);
    outState.putString("Ms", strMs);
    outState.putLong("Elapsed", elapsedTime);
    outState.putBoolean("Stopped", timerStopped);
    outState.putInt("Orientation", orientation);
}

@Override
public void onRestoreInstanceState(Bundle savedInstanceState){

    // Restore UI state from the savedInstanceState.
    if (savedInstanceState != null){
        String MinSec = savedInstanceState.getString("MinSec");
        if (MinSec != null)
        {
          timer.setText(MinSec);
        }
        String Ms = savedInstanceState.getString("Ms");
        if (Ms != null)
        {
          timerMs.setText(Ms);
        }
        long elapsed = savedInstanceState.getLong("Elapsed");
        if(elapsed > 0)
            elapsedTime = elapsed;
        int theOrientation = savedInstanceState.getInt("Orientation");
        //if(theOrientation > 0)
            //this.setRequestedOrientation(theOrientation); 
    }
}
于 2011-11-12T00:12:48.303 回答
0

我认为最好的解决方案是采用不同的方法,使用单个Activity并将每个选项卡内容放在不同LinearLayoutonClick()选项卡方法(将是一些按钮)中以在布局之间切换......

如果有人有更好的想法,请在这里发布!

谢谢!

于 2011-11-13T16:29:07.003 回答