【问题标题】:How to update layout after onConfigurationChange?如何在 onConfigurationChange 之后更新布局?
【发布时间】:2013-06-14 02:29:03
【问题描述】:

我正在构建我的第一个应用程序,并且快完成了。 (耶!)现在我所要做的就是为 onConfigurationChange 设置 Java,以便在更改方向以及拉出键盘时使用。 首先,问题是当方向改变时,所有东西都会被删除,因为 setContentView 方法放置了一个新的新布局。这当然是有道理的,但是我想知道是否有任何方法或可能的解决方法可以让 edittext 和 textview 值在方向/键盘更改时保持不变。我尝试了各种方法,例如在 setContentView 之前获取字符串值,但是我发现这只会导致 NullPointerException。

基本上,我试图让 edittext 和 textview 的值与方向或任何变化保持一致。

这里是我的代码的简要总结,供参考

这不是实际代码,只是我正在做的总结。

    public class MainActivity extends Activity {

      protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

     //do some stuff that is the core of the app. Nothing that would impact this question though

    }

      public void onConfigurationChanged(Configuration newConfig) {
     super.onConfigurationChanged(newConfig);

     if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE){

        setContentView(R.layout.landscape);
            // same code that was within the onCreate. Just doing stuff related to  my  app 

    }if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){

        setContentView(R.layout.main);
            // same code that was within the onCreate. Just doing stuff related to  my  app
    }
         }
    ' }

是的,我确实在我的 AndroidManifest 文件中写了 android:configChanges="方向|keyboardHidden" 该应用程序正常工作,我只是没有更新文本视图和编辑文本。 谢谢!

【问题讨论】:

    标签: android eclipse updates onconfigurationchanged


    【解决方案1】:

    您可以将值保存在savedInstanceState

    当您的活动开始停止时,系统会调用onSaveInstanceState(),以便您的活动可以保存状态。

    至于恢复值,可以使用

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState); // Always call the superclass first
    
        // Check whether we're recreating a previously destroyed instance
        if (savedInstanceState != null) {
            // Restore value of members from saved state
            mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
            mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
        } else {
            // Probably initialize members with default values for a new instance
        }
        ...
    }
    

    public void onRestoreInstanceState(Bundle savedInstanceState) {
        // Always call the superclass so it can restore the view hierarchy
        super.onRestoreInstanceState(savedInstanceState);
    
        // Restore state members from saved instance
        mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
        mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
    }
    

    您还可以将布局放在 layout 文件夹中用于 potrait 和 layout-land 用于横向,因此您无需在每次应用程序 restart 活动时在 onConfigurationChanged() 中调用 setContentView()

    链接:activity recreating

    【讨论】:

      【解决方案2】:

      但是我想知道是否有任何方法或可能的解决方法可以让 edittext 和 textview 值在方向/键盘更改时保持不变。

      这样做……不。当您调用setContentView() 时,它会将所有内容设置为默认值,因此TextViews 将具有其默认文本等...正如您所说,您可以尝试保存Strings 并再次设置它们,但这会变得混乱。你可以用“Android推荐”的方式处理它并使用 Handling Runtime Changes。但是,我目前自己处理所有这些问题,但在 orientation 更改期间我不会致电 setContentView()

      如果您要告诉我们您为什么这样做,那么我们也许可以为您提供更好的解决方案。但我不建议像这样多次调用setContentView()

      小例子

      @Override
          public void onConfigurationChanged(Configuration newConfig) {
            newConfig = Globals.getUserLanguage(this);
            super.onConfigurationChanged(newConfig);
            if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE)
            {
                btnSave = (Button) findViewById(R.id.lsSaveBtn);
                Button btnHide = (Button) findViewById(R.id.button1);
                btnHide.setVisibility(Button.GONE);
                btnSave.setVisibility(Button.VISIBLE);
          //    btnSave.setOnClickListener();
            }
            else
            {
                btnSave = (Button) findViewById(R.id.button1);    
                Button btnHide = (Button) findViewById(R.id.lsSaveBtn);
                btnHide.setVisibility(Button.GONE);
                btnSave.setVisibility(Button.VISIBLE);
            }
          }
      

      【讨论】:

      • 我是这样做的,因为我的编程经验很低,而且我知道改变事物外观方式的唯一方法是使用新布局。我也认为这更容易,但我想我错了哈哈。这是在我知道在 java 中使用一些策略来更改 UI 之前。无论如何,我可以使用任何一种方法来监听 edittext/textview 中的更改并使用该信息来更新新的?
      • 我明白自己是新手……别担心,你会明白的。我不确定你到底在问什么,但我添加了一个 Activity 的小例子,我根据 orientation 显示或隐藏某些 Views
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-04
      • 2019-01-28
      • 1970-01-01
      • 2013-09-14
      • 1970-01-01
      相关资源
      最近更新 更多