我如何处理方向更改以使片段无法加载?

How can I handle Orientation change so Fragment doesn't load?

当 UI 中的 EditText 行获得焦点时,会启动 DatePickerFragment 供用户输入日期。

方向改变时,如果 EditText 行有焦点和之前输入的日期(因此 length() > 0),我不希望片段自动显示。

有没有办法修改或添加代码,以便如果 Activity 是新创建的并且 EditText 行具有焦点,它不会自动启动 DatePickerFragment

onResume() 做点什么是个好主意吗?

或者用 savedInstanceState()!=null 做点什么?

public class Activity extends AppCompatActivity {
...
EditText.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
...
    if (hasFocus && (EditText.getText().length() == 0)) {
       DatePickerFragment newFragment = new DatePickerFragment();
       newFragment.show(getSupportFragmentManager(), "datePicker");
    }
    else if (hasFocus && (EditText.getText().length() > 0)) {
       ...
       DatePickerFragment newFragment = new DatePickerFragment();
       newFragment.show(getSupportFragmentManager(), "datePicker");
    }
 }
});
}

您是使用 viewPager 还是只是将片段添加到 activity?一种方法是将要在旋转时保持的数据保存到 onSaveInstanceState(Bundle outState) 包中,然后使用

在 onCreate 中恢复该数据
 if(savedInstanceState != null) {
   //get your data
 }

或者仅在加载 activity 时添加您的片段(在设备旋转后不重新加载)

if(savedInstanceState == null) 
{
    mFragmentManager = getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = mFragmentManager.beginTransaction();

    YourFragment fragment = new YourFragment();

    fragmentTransaction.add(R.id.fragment_container, fragment);
    fragmentTransaction.commit();
}

无论如何你一定要检查 this and this 个问题,它们可能会有帮助。

如果我是你,我不会使用 OnFocusChangeListener,而是使用 OnClickListener 在单击 EditText 时显示片段,并使 EditText 非可聚焦。

对于方向更改,值得注意的是,您可以通过在清单上向相关 activity 添加 android:configChanges="orientation" 来防止配置更改对 activity 生效。虽然不确定这对您的情况是否有帮助,但您可以看看。