Android中屏幕方向发生变化时屏幕闪烁?

时间:2011-07-14 14:01:12

标签: android orientation android-orientation

我有两项活动AB。我已将screenOrientation的{​​{1}}声明为纵向,并将A声明为清单文件中的横向。我正在从BA开始活动。当我开始活动B以及完成活动A时,我的屏幕会闪烁。我已将B作为configChanges设置为orientation

这是Manifest代码段:

<application
<activity android:name=".A"
            android:label="@string/app_name" android:theme="@style/MyTheme"
            android:screenOrientation="portrait" android:windowSoftInputMode="stateAlwaysHidden|adjustUnspecified"
            android:configChanges="orientation" />
<activity android:name=".B"
            android:label="@string/app_name" android:theme="@style/MyTheme"
            android:screenOrientation="landscape" android:windowSoftInputMode="stateAlwaysHidden|adjustUnspecified"
            android:configChanges="orientation" />

</application>

有什么想法解决这个问题吗???

先谢谢。

1 个答案:

答案 0 :(得分:1)

首先,当你在屏幕之间启动意图时,你是否试图覆盖PendingAnimation?也许有些褪色或其他什么。

我也看到这可能是一个问题,因为当你开始一个新的活动有一点时间,直到视图在setContentView中膨胀,所以你可能会看到屏幕变黑,直到该步骤完成。也许使用traceview来查看占用时间的位置,并且可能会稍微优化onCreate-&gt; onDestroy方法。

创建活动是一个昂贵的过程。也许如果这对你来说真的很烦人,可以使用视图鳍状肢并将所有代码移动到单独的视图中,将它们从xml中膨胀(也许如果它们太重,你可以在onCreate中加载它们并且可能重用很多为纵向视图和横向声明的变量。您将在活动中保留相关代码,并将每个视图的唯一功能移动到视图类中。

这只是一个挑战。我用Coverflow和包含图像拇指的gridView做了这个,结果很棒。切换视图真的很快,它的内存消耗非常低,主要是因为数据是在视图之间共享的。

修改

所以你想做这样的事情让视图重新启动或者保持配置状态(在android文档中它表示方向更改的处理方式更快一些)。 以下是使用活动组处理方向更改的代码:

我有2个活动A和B,可以是任何类型(TAbActivity等......)

我有一个名为OrientationChangeActivity的主要活动:

    public class OrientationChangeActivity extends ActivityGroup {
        private ArrayList<String> mIdList;

        @Override
        public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        mIdList = new ArrayList<String>();
        if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
            startChildActivity("ActivityA", new Intent(this, ActivityA.class));
        } else if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
            startChildActivity("ActivityB", new Intent(this, ActivityB.class));
        }
        }
............

这是使用我评论中发布的链接。我将活动A设置为方向纵向,将活动B设置为横向。我让OrientationChangeActivity自行重启(在清单中不包含configChage声明),从而再次调用onCreate并切换活动。

您还可以查看代码:

@Override
public void finishFromChild(Activity child) {
LocalActivityManager manager = getLocalActivityManager();
int index = mIdList.size() - 1;

if (index < 1) {
    finish();
    return;
}

manager.destroyActivity(mIdList.get(index), true);
mIdList.remove(index);
index--;
String lastId = mIdList.get(index);
Intent lastIntent = manager.getActivity(lastId).getIntent();
Window newWindow = manager.startActivity(lastId, lastIntent);
setContentView(newWindow.getDecorView());
}

告诉您如何在activityGroup中创建活动并将其设置为视图。您可以使用此代码在此处创建活动,并根据方向更改将其设置为内容视图。(意味着您需要添加configChage = orientation)。