在安卓系统中,屏幕方向改变后视图布局没有刷新

9

我希望在屏幕方向改变时调整我的VIEW布局。

我的清单文件中设置了:android:configChanges="keyboardHidden|orientation"

我有res/layout-landres/layout-port

在我的Activity中,我有一个ViewFlipper并且里面有LinearLayouts

当我在横向或纵向模式下启动Activity时,视图的布局是正确的(根据我的res/layout-????文件)。

但是,当我已经在Activity中,并旋转手机时,我的视图布局没有改变。屏幕被旋转,ActivityonCreate没有被调用,而是应该被调用的onConfigurationChanged被调用了,但屏幕总是用加载Activity时的LinearLayout重新绘制。

我觉得我在onConfigurationChanged中漏掉了一些东西,但不知道是什么。我猜我需要在ViewFlipper或内部的LinearLayout上调用某些函数。我应该调用哪些函数呢?

ViewFlipper flipper;

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    flipper = new ViewFlipper(getApplicationContext());
    setContentView(flipper);
    initLayout();
}

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    setContentView(flipper);
}

void initLayout() {
    MyView myview = createMyView(0);
    flipper.addView(myview, 0);
    myview = createMyView(1);
    flipper.addView(myview, 1);
    myview = createMyView(1);
    flipper.addView(myview, 1);
}

我尝试在onConfigurationChanged()中添加flipper = new ViewFlipper(getApplicationContext());,但旋转后一切都变黑了。我想我必须调用initLayout,但那会重新计算一切(这正是我不想做的,也是我试图使用onConfigurationChanged而不是Android默认的“dropMyActivity和createANewActivity”的原因)。 解决方案: 之前我以为我可以在旋转时触发布局刷新,但似乎我必须使用当前上下文(在方向更改后)重新创建布局。
@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    setContentView(R.layout.category_flipper);
    ViewFlipper oldFlipper = viewFlipper;
    viewFlipper = (ViewFlipper)findViewById(R.id.categoryFlipper);
    for (int i = 0; i < 3; i++) {
        final CardLayout cl = new CardLayout(this, cardData[i]);
        viewFlipper.addView(cl);
    }
    cardData[viewIndex].restorePlayer();
    viewFlipper.setDisplayedChild(viewIndex);
    oldFlipper.removeAllViews();
}
2个回答

9
如果flipper是最初安装的视图的引用,那么这就是问题的原因。您需要传递所需布局的资源ID,而不是旋转手机之前的旧视图。然后内容视图将绑定到新资源。也许可以尝试类似以下代码(根据我的猜测修改资源标识符):
@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    setContentView(R.layout.flipper);
    flipper = (ViewFlipper) findViewById(R.id.flipper);
}

好的,这似乎是正确的方向,但仍需找出如何适应我的情况。我将在原问题中添加一些代码。 - Gavriel
1
@Flöcsy - 我正在查看initLayout,它包含你说你不想重复的工作,但它看起来只是再次创建所有视图。当屏幕旋转时,这正是您需要重置显示的内容。如果您在创建视图的同时进行了昂贵的计算,并且这些计算确实与配置无关,则可以按照此处所述的方式捕获并重用它们:http://developer.android.com/resources/articles/faster-screen-orientation-change.html - Ted Hopp
Ted,我认为你是对的。虽然createMyView是昂贵的工作,但现在我有了想法,可能我正在做比我应该做的更多(例如,我正在解析zip文件以查找图像(显示在ImageButton上)和mp3文件(播放按钮被按下时)。 - Gavriel
你可以将图像保存为非配置数据来保留对它们的引用。可能对于mp3文件也是一样的。 - Ted Hopp

0

将其放入您的Android清单中。android:configChanges="orientation"

在这种情况下,只需尝试这个并设置您的布局...

    if (Intraday.this.getResources (). getConfiguration (). orientation == Configuration.ORIENTATION_PORTRAIT){ 


    }
    else if (Intraday.this.getResources (). getConfiguration (). orientation == Configuration.ORIENTATION_LANDSCAPE) {      


    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接