1.您可以通过在清单中添加android:screenOrientation =“portrait”(或“landscape”)来锁定活动的一个方向。
2.您可以通过在标记中指定android:configChanges =“screenOrientation”告诉系统您打算自己处理屏幕更改。这样就不会重新创建活动,而是会收到一个回调(你可以忽略它,因为它对你没用)。
这些工作都没有。让我更详细地解释一下我的特殊问题......
我正在尝试一个非常简单的应用程序作为学习练习。我在服务器上有一个文本文件。文本文件中有一个东西:单行上的一个整数。此数字是也存储在此服务器上的图像文件数,图像全部命名为0.jpg,1.jpg,2.jpg等。
我的所有代码都在我的活动的onCreate方法中(就像我说它是一个简单的应用程序)。
应用程序在运行时执行以下操作:
从文本文件中读取数字。 生成从零到文件中的数字的随机数。 使用URL中的随机数将随机图像加载到imageview中。
当屏幕旋转时,我不希望所有这一切再次发生。我只是希望没有发生......除了屏幕应该明显地旋转并且图像应该缩放以适应它所做的。但每次屏幕旋转时,所有代码都会运行并且会选择一个新的随机图像。有人可以给我一个简单的解决方案与工作代码来解决这个问题吗?我通过观察来学习,如果你不能提供代码示例它就不会有帮助。
提前感谢。
ps ...我不是在寻找一种不同的方式来做我正在做的事情,这不是重点。我正在寻找FIX目前我正在做的方式。
答案 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。 事实证明,静态类变量在加载应用程序时被初始化一次,但是当重新加载应用程序时,这些变量不会再次初始化。
这些变量可以包含您不想重新初始化的状态或对象。 我不能说这不是超级优雅,而是为我测试和工作。