【问题标题】:Handling rotation changes and user leaving activity处理轮换变化和用户离开活动
【发布时间】:2016-05-01 15:30:29
【问题描述】:

所以我有了这个带有 doSomething() 方法的 Activity。当用户离开 Activity 并在一段时间后恢复时,必须调用此方法。这段代码工作正常。问题是:当用户旋转手机(方向改变)时,该方法也被调用。我不希望在方向更改时调用该方法。这是我的活动代码

public class MainActivity extends AppCompatActivity
{
  private static boolean callMethod=true;
  @Override
    protected void onResume() {
        super.onResume();
        if(callMethod)
           doSomething();
    }
    @Override
    protected void onPause() {
        super.onPause();
        callMethod=true;
    }

private void doSomething()
{
    Log.i(“doSomething()”,”Did something.”);
}
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);
        if(callMethod)
          doSomething();
    }

}

提前致谢!

【问题讨论】:

    标签: android android-activity screen-orientation screen-rotation


    【解决方案1】:

    从 API 13 开始,您可以在清单中使用 configChanges

    将以下内容添加到清单中。这可以防止在屏幕旋转时重新创建活动:

    <activity android:name=".Activity_name"
    android:configChanges="orientation|keyboardHidden">
    

    请注意,在此之后,您应该自己处理屏幕方向更改。为此,您应该在 Activity 中覆盖以下函数:

     public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        if(newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE){
            setContentView(R.layout.layout_landscape);
        }
        else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
            setContentView(R.layout.layout);         
        }
    }
    

    【讨论】:

    • 仅将该行添加到清单中不起作用。但它有所帮助。我还添加了 if(!isChangingConfigurations()) callMethod = true;现在它完美无缺。谢谢
    【解决方案2】:

    我在您的评论中看到您添加了 isChangingConfigurations() 标志,这应该可以解决问题,但您应该保持该状态而不是使其成为静态变量。否则,如果您的进程在您的应用程序进入后台时被终止,您将失去该状态。

    public class MainActivity extends AppCompatActivity {
        private static final String KEY_CALL_METHOD = "key_call_method";
    
        private boolean callMethod = true;
    
        @Override
        protected void onCreate(Bundle savedState) {
            super.onCreate(savedState);
            setContentView(R.layout.activity_main);
    
            if (savedState != null) {
                callMethod = savedState.getBoolean(KEY_CALL_METHOD);
            }
        }
    
        @Override
        protected void onResume() {
            super.onResume(); 
            if (callMethod) {
                doSomething();
            }
        }
    
        @Override
        protected void onPause() {
            super.onPause();
            if (!isChangingConfigurations()) {
                callMethod = true;
            }
        }
    
        @Override
        protected void onSaveInstanceState(Bundle outState) {
            super.onSaveInstanceState(outState);
            outState.putBoolean(KEY_CALL_METHOD, callMethod);
        }
    
        private void doSomething() {
            Log.i("doSomething()", "Did something.");
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-28
      • 1970-01-01
      相关资源
      最近更新 更多