android 重新加载活动,Android – 屏幕方向重新加载活动

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

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

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

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

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

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

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

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

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

提前致谢。

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

这里有一个非常相似的问题: 当方向改变时,不要重新加载应用程序

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

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

如果是,那就做全部。 如果不是,只需设置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; }

这是有效的,我100%肯定。

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

在API级别13或更高级别,当方向更改时,屏幕大小会更改,因此这仍会导致活动在方向更改时被销毁并启动。

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

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

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

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

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

例如,添加到清单:

然后只需覆盖默认函数:

@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 } }

注意:如果您覆盖此function,则必须自行重做布局。 这是做你想做的事的唯一方法。 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当前的根视图invalidate ,并查看它是否将正确重绘。

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

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

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值