如何在onConfigurationChange后更新布局



我正在构建我的第一个应用程序,我几乎完成了。(耶!)现在我所要做的就是为方向改变和键盘拔出时使用的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"应用程序工作像它应该,我只是没有文本视图和编辑文本正在更新。谢谢!

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

这样做…不。当你调用setContentView()时,它会将所有内容设置为默认值,因此TextView s将具有默认文本,等等…你可以,正如你所说的,尝试保存Strings并再次设置它们,但这会变得混乱。你可以按照"Android推荐"的方式来操作和使用处理运行时更改。但是,我目前自己处理所有这些,但是在orientation更改期间我不调用setContentView()

如果你能告诉我们你为什么这样做,那么我们可能会给你一个更好的解决方案。但我不建议像这样多次调用setContentView() <<p> 小例子/strong>
@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);
      }
    }

可以保存在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文件夹的肖像和layout-land的风景,这样你就不需要调用setContentView()onConfigurationChanged()每次应用程序restart活动

链接:activity recreating

相关内容

  • 没有找到相关文章

最新更新