Android:使用返回堆栈(片段)时未更新可绘制选择器
Android : Drawable selector not updated when using back stack (fragment)
我的一个 Fragment 中的 ToggleButtons 有一些问题。我有一个主要的 activity,我在其中加载了一些片段,这些片段被添加到 BackStack。
在其中一个片段中,我有一个列表视图,上面有 3 个切换按钮。这些按钮具有可绘制的背景:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_checked="true">
<shape android:shape="oval">
<solid android:color="@color/greenbutton" />
<stroke android:width="4dp" android:color="@color/actionBlueLight"/>
</shape>
</item>
<item android:state_checked="false">
<shape android:shape="oval">
<solid android:color="@color/greenbutton" />
</shape>
</item>
</selector>
当我按下这些按钮之一时,我过滤了我的 ListView。我可以 select 我的列表中的一个项目将启动另一个片段(也添加到后台堆栈)。
我的问题是当我按下后退按钮并使用我的 ListView 返回片段时,按钮的背景没有更新。我的意思是我把
在我的片段中:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstance) {
...
Log.d(TAG,"Green = "+buttonGreen.isChecked());
Log.d(TAG,"Orange = "+buttonOrange.isChecked());
Log.d(TAG,"Red = "+buttonRed.isChecked());
...
}
所有按钮似乎都未选中(来自 isChecked()),但在我切换到另一个片段之前选中的按钮仍然具有对应于 state_checked="true".[=13= 的背景]
我试过 invalidate() 按钮在 onCreateView 中刷新它们,但它没有做任何事情。
好吧,我终于通过强制取消选中 Fragment 的 onStop() 方法中的 ToggleButtons 来解决我的问题。通过这种方式,我可以确定在 popBackStack() 之后重新加载片段时,默认背景不能是与 state_checked="true".
关联的背景
public void onStop () {
buttonGreen.setChecked(false);
buttonOrange.setChecked(false);
buttonRed.setChecked(false);
super.onStop();
}
它看起来像是一种解决方法,我很希望理解为什么按钮状态在 onCreateView() 中显示为 "unchecked" 而可绘制对象可见是 "checked" 按钮的状态。
我的一个 Fragment 中的 ToggleButtons 有一些问题。我有一个主要的 activity,我在其中加载了一些片段,这些片段被添加到 BackStack。
在其中一个片段中,我有一个列表视图,上面有 3 个切换按钮。这些按钮具有可绘制的背景:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_checked="true">
<shape android:shape="oval">
<solid android:color="@color/greenbutton" />
<stroke android:width="4dp" android:color="@color/actionBlueLight"/>
</shape>
</item>
<item android:state_checked="false">
<shape android:shape="oval">
<solid android:color="@color/greenbutton" />
</shape>
</item>
</selector>
当我按下这些按钮之一时,我过滤了我的 ListView。我可以 select 我的列表中的一个项目将启动另一个片段(也添加到后台堆栈)。
我的问题是当我按下后退按钮并使用我的 ListView 返回片段时,按钮的背景没有更新。我的意思是我把 在我的片段中:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstance) {
...
Log.d(TAG,"Green = "+buttonGreen.isChecked());
Log.d(TAG,"Orange = "+buttonOrange.isChecked());
Log.d(TAG,"Red = "+buttonRed.isChecked());
...
}
所有按钮似乎都未选中(来自 isChecked()),但在我切换到另一个片段之前选中的按钮仍然具有对应于 state_checked="true".[=13= 的背景]
我试过 invalidate() 按钮在 onCreateView 中刷新它们,但它没有做任何事情。
好吧,我终于通过强制取消选中 Fragment 的 onStop() 方法中的 ToggleButtons 来解决我的问题。通过这种方式,我可以确定在 popBackStack() 之后重新加载片段时,默认背景不能是与 state_checked="true".
关联的背景public void onStop () {
buttonGreen.setChecked(false);
buttonOrange.setChecked(false);
buttonRed.setChecked(false);
super.onStop();
}
它看起来像是一种解决方法,我很希望理解为什么按钮状态在 onCreateView() 中显示为 "unchecked" 而可绘制对象可见是 "checked" 按钮的状态。