哦,
所以首先我有一个活动
public class MainActivity extends FragmentActivity
{
private FragmentA a;
private FragmentB b;
private FragmentC c;
private HomeFragment mHomeFragment;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.home_activity_layout);
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.fragment_container, mHomeFragment) // replace flContainer
.addToBackStack(null)
.commit();
...
}
我使用一些惰性初始化程序,并将对象a,b,c和mHomeFragment保留在我的活动对象中,
我在“ b”中有一个按钮,它调用MainActivity来调用“ c”
在“ c”内部的一个按钮,它调用MainActivity来调用“ b”
还有一些其他按钮来叫“ a”并不重要
现在,在我的FragmentB中,我有一些自定义视图,
public CustomView(Context cnx, SettingsViewElement e, FragmentA fragment)
{
super(cnx);
inflate(cnx, R.layout.my_layout,this);
parent = fragment; // i use it later in my onCheckedChangeListener to tell him the the switch has been checked
condition = parent.getCondition();
titleTv = this.findViewById(R.id.title_tv);
switch = this.findViewById(R.id.switch);
if(condition){
switch.setChecked(true);
titleTv.setTitle("i am depressed af :(");
}
我的问题是:
为什么即使我的titleTv正在更新标题,我的开关也没有被选中?
我做了一些测试,每次我在片段事务中调用replace()时,都会调用OnCreated()。
我的片段重新实例化了视图,然后在扩大布局后将它们添加到linearLayout中。
另外,如果我不将片段引用保存在MainActivity中,然后每次重新实例化。
在这里:switch.setChecked将起作用,
但是backStack会很大又笨
例如:stack ='b'->'c'->'b'->'c'
通常,当用户单击两次返回按钮时,他会回到homeFragment,
他不需要自己清空堆栈。
即使我每次重写@onBackPressed()并重新实例化片段,希望每次android sdk都会释放空间。
每当我想在设计中添加新片段时,都必须手动进行操作,这将是对轮子的重新发明。
和:它不解释为什么Switch.setChecked()不起作用,即使条件为true并且其他视图正在更新(textView正在更新其文本)
更新:显然,
如果片段被重新使用并且onCreate()被调用
第二次,(片段的引用保存在某个地方
和片段被附加第二次)在这里setChecked
不会生效,只有其他一些视图更新
同时,只有在第一次调用它时,它才会起作用
片段正在创建中
解决方案:更新OnResume()方法中的视图
如果有人对此有解释,请继续
最佳答案
更新:
显然,
如果片段被重用并且第二次调用onCreate(),(片段的引用被保留在某个地方,片段被附加了第二次)
这里的setChecked不会生效,只有其他一些视图更新
同时,它只有在第一次创建该片段时才起作用,
解决方案:
在OnResume()方法中更新视图
如果有人对此有解释,
请继续