LiveData:方向更改后,通过DialogFragment创建的对话框将重新创建两次

时间:2018-08-10 07:49:58

标签: android android-dialogfragment android-orientation android-livedata

我有一个liveData对象,可用来控制是否显示我的警报对话框。 此警报对话框基于DialogFragment。 当为此liveData调用onChanged(true)时显示警报。

现在,当警报显示且方向改变时,警报将被重新创建两次,一次又一次。 这似乎是因为,默认情况下,Android在方向更改时会重新创建警报,但在方向更改时会再次调用liveData onChanged(true)。因此,警报创建了两次。

是否有一种方法可以阻止Android重新创建对话框本身,以便我自己可以通过LiveData对象处理重新创建的事情?

谢谢。

3 个答案:

答案 0 :(得分:0)

由于它是一个对话框,因此可以在每次关闭对话框对象时将其设置为null,并在弹出对话框时创建一个新对象。并且每次检查是否为空时,如果不为空,则不要打开另一个对话框。如果为null,则仅打开对话框。

答案 1 :(得分:0)

您应该尝试使用'if()'语句检查是否

getFragmentManager().findFragmentByTag("dialog");

getFragmentManager().findFragmentById("idOfDialog")

返回null,如果是,则没有对话框,您可以创建新对话框。 我要使用的其他解决方案,处理配置更改。 https://developer.android.com/guide/topics/resources/runtime-changes 这样,您就可以将liveData的观察者放在onCreate中,并且只有在liveData发生更改时,它才会在旋转时触发,但这要做的更加复杂。

答案 2 :(得分:0)

这是因为当配置发生更改时,android本身会在其之上再创建一层。 希望这会有所帮助。

if (savedInstanceState == null) {
    // only create fragment if activity is started for the first time
    mFragmentManager = getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = mFragmentManager.beginTransaction();

    FragmentOne fragment = new FragmentOne();

    fragmentTransaction.add(R.id.fragment_container, fragment);
    fragmentTransaction.commit();
} else {        
    // do nothing - fragment is recreated automatically
}