如何处理屏幕方向的变化,以便Fragment不会重新加载?

5

当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");
    }
 }
});
}
2个回答

4

您是使用viewPager还是将片段添加到活动中?一种方法是将您想要在旋转时保持的数据保存到onSaveInstanceState(Bundle outState)捆绑包中,然后在创建时恢复该数据。

 if(savedInstanceState != null) {
   //get your data
 }

或者只在活动被加载时(设备旋转后不重新加载)添加您的片段。

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

    YourFragment fragment = new YourFragment();

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

无论如何,您绝对应该查看这个这个问题,它们可能会有所帮助。


嗨,我只是在活动中添加片段。我将编辑上面的内容以显示该活动。 - AJW
好的,我正在使用DatePickerDialog,所以show(getSupportFragmentManager)会执行片段事务。"if(savedInstanceState == null)"这一行也可以解释为当savedInstanceState不为空时不要添加片段,这在设备旋转后是正确的吗? - AJW
是的,即使您没有将任何数据保存到outState bundle中,如果设备旋转,则savedInstanceState也不会为空。 - Ivan V
太好了,它有效。另外,既然我有长度测试 "if (hasFocus && (EditText.getText().length() == 0))",那么我后面是否需要明确包含 "length()>0",如上所示,或者如果长度不等于0,则始终如此,因此不需要 length>0? - AJW
如果您想仅在设备旋转且编辑文本不为空时创建片段,则应再次使用它。 - Ivan V

3
如果我是你,我会使用OnClickListener来显示片段,而不是使用OnFocusChangeListener。当EditText被点击时,使EditText无法获取焦点。关于屏幕旋转问题,值得注意的是,您可以通过在Manifest文件中向相关活动添加android:configChanges="orientation"来防止配置更改对活动产生影响。虽然不确定这是否对您有所帮助,但您可以尝试一下。

在编程中,添加android:configChanges="orientation"可以很好地防止Activity重新启动。但是,如果您只需要防止Fragment重新创建而不是整个Activity,则此方法无效。 - Ivan V
谢谢您的留言。但是,有些用户会使用Tab键而不是在EditText上单击鼠标。如果我将其设置为非可聚焦,则用户将无法使用Tab键将焦点移动到EditText上。 - AJW
我忘了提到我的Activity也有OnClickListener代码,就像你建议的那样。谢谢! - AJW

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接