Android - 屏幕方向重新加载活动

时间:2011-05-06 16:43:14

标签: android

我会重新问这个问题,因为那里有很多不好的信息,真的令人沮丧。简短的故事是,当设备方向改变时,我不希望任何改变或发生。给这个问题最流行的两个“解决方案”是:

1.您可以通过在清单中添加android:screenOrientation =“portrait”(或“landscape”)来锁定活动的一个方向。

2.您可以通过在标记中指定android:configChanges =“screenOrientation”告诉系统您打算自己处理屏幕更改。这样就不会重新创建活动,而是会收到一个回调(你可以忽略它,因为它对你没用)。

这些工作都没有。让我更详细地解释一下我的特殊问题......

我正在尝试一个非常简单的应用程序作为学习练习。我在服务器上有一个文本文件。文本文件中有一个东西:单行上的一个整数。此数字是也存储在此服务器上的图像文件数,图像全部命名为0.jpg,1.jpg,2.jpg等。

我的所有代码都在我的活动的onCreate方法中(就像我说它是一个简单的应用程序)。

应用程序在运行时执行以下操作:

从文本文件中读取数字。 生成从零到文件中的数字的随机数。 使用URL中的随机数将随机图像加载到imageview中。

当屏幕旋转时,我不希望所有这一切再次发生。我只是希望没有发生......除了屏幕应该明显地旋转并且图像应该缩放以适应它所做的。但每次屏幕旋转时,所有代码都会运行并且会选择一个新的随机图像。有人可以给我一个简单的解决方案与工作代码来解决这个问题吗?我通过观察来学习,如果你不能提供代码示例它就不会有帮助。

提前感谢。

ps ...我不是在寻找一种不同的方式来做我正在做的事情,这不是重点。我正在寻找FIX目前我正在做的方式。

5 个答案:

答案 0 :(得分:10)

除非应用程序的API级别为12或更低,否则使用android:configChanges="orientation"的解决方案将无效。

在API级别13或更高版本中,当方向发生变化时,屏幕大小会发生变化,因此,当方向发生变化时,这仍会导致活动被破坏并启动。

只需添加“screenSize”属性,就像我在下面所做的那样:

<activity>
    android:name=".YourActivityName"
    android:configChanges="orientation|screenSize">
</activity>

现在,当您的更改方向(和屏幕大小更改)时,活动将保持其状态并调用onConfigurationChanged()。当方向发生变化时,这将保留屏幕上的任何内容(即:Webview中的网页)。

从本网站了解到这一点:http://developer.android.com/guide/topics/manifest/activity-element.html

此外,这显然是一种不好的做法,请阅读下面有关处理运行时更改的链接:

http://developer.android.com/guide/topics/resources/runtime-changes.html

答案 1 :(得分:3)

这里有一个非常类似的问题:Don't reload application when orientation changes

无论如何,首先你应该将代码从onCreate更改为另一种方法并将其除以“创建随机数并从网络加载图像”和“将图像设置为视图”。

您在活动上有一个位图,您可以在每次活动开始时验证它是否为空。

如果是,那就做全部。如果不是,只需使用您拥有的位图设置ImageView或其他任何内容。

要避免在旋转时销毁Bitmap,请执行以下操作:

    Bitmap image = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);

 image = (Bitmap) getLastNonConfigurationInstance();

     if(bitmap == null){
         image = downloadImage();
      }
     setImage(bitmap);
}


@Override
public Object onRetainNonConfigurationInstance() {
    return bitmap;
}

这很有效,我百分百肯定。

答案 2 :(得分:0)

将图片详细信息保存在onPause()onStop()中,并在onCreate(Bundle savedInstanceState)中使用它来恢复图片。

有关实际流程的更多信息,请参阅http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle,因为Honeycomb与以前的Android版本不同。

答案 3 :(得分:0)

例如,添加到清单:

<activity android:name=".Explorer" android:label="@string/app_name"
            android:configChanges="orientation" android:launchMode="standard">
        </activity>

然后只需覆盖默认功能:

    @Override
        public void onConfigurationChanged(Configuration _newConfig){
            super.onConfigurationChanged(_newConfig);
int height = getWindowManager().getDefaultDisplay().getHeight();
        int width = getWindowManager().getDefaultDisplay().getWidth();
        if(width > height){
// layout for landscape
}else{
// layout for portrait
        }
            }

注意:如果您覆盖此功能,则必须自行重做布局。这是做你想做的事的唯一方法。 Android修复屏幕尺寸的方法是将整个活动吹走,然后使用新尺寸重新启动它。如果您选择不让它消除活动,那么您必须处理屏幕尺寸变化。没有任何其他选择。

编辑:在这个特定的应用程序中,我有一个以纵向显示的表格,以及一个以横向显示的图表。所以我这样做:

void showDataView()
    {
        setContentView(mainView);
        currentView = mainView; 
    }

    void showGraphView()
    {
        if(currentView == mainView){
            if(graphView == null){
                setContentView(R.layout.graphview);
                graphView = (GraphView)findViewById(R.id.graphview);
            }
            setContentView(graphView);
            currentView = graphView;
            graphView.setDataToPlot(DATA_TO_PLOT);
            graphView.clear();
        }
    }

@Override
    public void onConfigurationChanged(Configuration _newConfig){
        super.onConfigurationChanged(_newConfig);
        int height = getWindowManager().getDefaultDisplay().getHeight();
        int width = getWindowManager().getDefaultDisplay().getWidth();
        if(width > height){
            showGraphView();
        }else{
            showDataView();
        }
        if(graphView != null) graphView.setGraphWidth(width);
    }

每次方向改变时,我都会将内容视图从一个切换到另一个。在您的情况下,您可以只invalidate当前的根视图,看看它是否会正确重绘。

这就是为什么你希望平台能够处理它,所以你不要处理这个垃圾。您最好只使用onSaveInstanceState保留所需的特定数据,然后在onCreate中查看该数据,然后再使用它。有关该信息,请参阅http://developer.android.com/reference/android/app/Activity.html#ConfigurationChanges

答案 4 :(得分:0)

对我有用的是将其中一个类变量声明为static。 事实证明,静态类变量在加载应用程序时被初始化一次,但是当重新加载应用程序时,这些变量不会再次初始化。

这些变量可以包含您不想重新初始化的状态或对象。 我不能说这不是超级优雅,而是为我测试和工作。

相关问题