Android TabActivity和Orientation更改

时间:2011-11-04 13:32:43

标签: android screen-orientation tabactivity android-tabactivity

我有TabActivity来举办其他三项活动。

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

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

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

编辑:

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

3 个答案:

答案 0 :(得分:1)

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

<activity android:name=".Settings" android:screenOrientation="portrait"
            android:configChanges="orientation"></activity>

答案 1 :(得分:1)

就这样我很清楚,你是说你有几个标签,它们使用不同的方向(纵向或横向),你在切换标签和正确设置相应的方向时遇到问题?

回应Cata的评论:

是的,所以无论何时旋转屏幕,当前可见活动都会被销毁,并且再次调用onCreate(如果我记得这些步骤)。您需要做的是调用getCurrentTab(),它返回表示选项卡的int值,并在调用onCreate时将其重置为活动选项卡。您可以通过多种方式执行此操作...通过使用一个小方法来处理并通过onCreate调用它,或者使用onSaveInstanceState(Bundle)来保存当前数据,以及onRestoreInstanceState()来重新加载选项卡数据。 / p>

你可以设置一个全局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); 
    }
}

答案 2 :(得分:0)

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

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

谢谢!