视图布局不会在android中的方向更改时刷新

Posted

技术标签:

【中文标题】视图布局不会在android中的方向更改时刷新【英文标题】:View layout doesn't refresh on orientation change in android 【发布时间】:2011-04-15 04:09:51 【问题描述】:

我希望在方向更改时调整我的 VIEW 布局。

我的清单设置为:android:configChanges="keyboardHidden|orientation" 在活动中。

我有res/layout-landres/layout-port

我的Activity 中有onConfigurationChanged(它在轮换时被调用)。

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

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

但是当我已经在Activity 中并旋转手机时,我的视图布局不会改变。屏幕被旋转,并且活动的onCreate没有被调用,因为它应该是,onConfigurationChangedActivity中被调用,但是屏幕总是用LinearLayout重绘时加载的Activity 开始了。

我感觉我错过了onConfigurationChanged 中的某些内容,但不知道是什么。我想我需要在内部的ViewFlipperLinearLayout 上调用一些函数。我应该调用什么函数?

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);

我尝试将flipper = new ViewFlipper(getApplicationContext()); 添加到onConfigurationChanged(),但这使得旋转后一切都变黑了。我想我必须调用 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();

【问题讨论】:

【参考方案1】:

如果flipper 是对最初安装的视图的引用,那就是导致问题的原因。您需要传递所需布局的资源 ID,而不是手机旋转之前的旧视图。然后内容视图将绑定到新资源。也许是这样的(以我对您的资源标识符的猜测为模):

@Override
public void onConfigurationChanged(Configuration newConfig) 
    super.onConfigurationChanged(newConfig);
    setContentView(R.layout.flipper);
    flipper = (ViewFlipper) findViewById(R.id.flipper);

【讨论】:

好的,这似乎是一个好的方向,但仍然需要找出如何适应我的情况,我会在原始问题中添加更多代码 @Flöcsy - 我正在查看 initLayout,其中包含您说您不想重复的工作,但看起来它只是再次创建所有视图。这正是您在屏幕旋转时重置显示所需要做的。如果您在创建视图的同时进行昂贵的计算,并且这些确实独立于配置,您可以按照here 的描述捕获并重新使用它们 泰德,我认为你是对的。虽然 createMyView 是一项昂贵的工作,但我现在明白了,可能我做的比我应该做的要多得多(例如,我正在解析一个 zip 文件以查找图像(显示在 ImageButton 上)和mp3 文件(播放按钮时播放)。 您可以通过将图像保存为非配置数据来保留对图像的引用。 mp3 文件可能也是如此。【参考方案2】:

把它放在你的 android manifest 中。 android:configChanges="orientation"

在这种情况下,试试这个并设置你的布局......

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


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


    

【讨论】:

以上是关于视图布局不会在android中的方向更改时刷新的主要内容,如果未能解决你的问题,请参考以下文章

当被模态视图控制器覆盖时,iOS 6 视图控制器布局在方向更改后不会更新

在片段中在运行时更改方向时更改布局而不重新创建视图

UINavigationController 上的 UIPageViewController 在更改方向后不会重新布局其子视图控制器

使用自动布局更改方向时更改内容顺序

在方向更改时调整 ConstraintLayout

android在单击按钮时更改列表视图内的图像视图