我有一个对象Foo,它可以使用片段(efFraank)进行配置。Foo类包含对FooFraank的静态引用和方法public Fraank getConfigurationFraank();此方法将当前对象分配给FooFraank并返回它。
public class Foo{
private static FooFragment fooFragment = new FooFragment();
html" target="_blank">public Fragment getConfigurationFragment(){
fooFragment.setObject(this);
return fooFragment;
}
//various getters and setters
}
足球碎片大致如下:
public class FooFragment extends Fragment{
private Foo f;
private EditText field1, field2, etc;
public void setObject(Foo f){
this.f = f;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
//inflate view
setupFieldListeners();
//return view object
}
@Override
private void onStart(){
super.onStart();
setupFields();
}
private void setupFields(){
field1.setText(f.getField1());
field2.setText(f.getField2());
//etc
}
private void setupListeners(){
field1.addTextChangedListener(new TextWatcher(){
@Override
public void afterTextChanged(Editable e){
f.setField1(e.getText().toString());
});
//Other empty necessary methods
field2.addTextChangedListener(new TextWatcher(){
//...
});
}
}
当我第一次在对象foo1上使用片段时,一切都很好。显示正确的信息,一切正常。
当我在另一个对象foo2上第二次使用该片段时,打开该片段会导致foo1中的所有属性(field1、field2等)写入foo2。我认为这是因为当再次添加片段时,restoreViewState()方法会运行,它会将EditText字段的值更改为foo1的值,从而引发extextchanged()方法,并将foo1的值写入foo2。
我尝试了以下方法来解决此问题:
-每当调用getConfigurationFragment()时,创建一个新的FooFragment对象。这是可行的,但我认为这不是最佳的,因为我知道避免在移动平台上不必要地创建对象是很好的。
-重写片段中的onSaveInstanceState(),并发送空捆绑包。这不起作用,因为当片段关闭时,它看起来不会被调用。它不起作用。
-将setupFields()调用放在OnStart()、OnResume()、OnCreateView()中。这些都不起作用,因为当restoreViewState()运行时,它会破坏fo2对象。
-在onCreate()和onCreateView()中将Bundle设置为空。不起作用。
我如何才能将foo2信息加载到重用的片段中?
我对FragmentTransaction机制没有最好的理解。是否可以以某种方式告诉FragmentManager恢复View状态?
我所尝试的重用配置片段的想法是否存在根本性缺陷,是否可以避免?如果是,为什么?
有没有其他魔法能让这一切起作用?
提前感谢您的时间。
我在片段视图状态恢复方面也有过类似的斗争。防止它的一种方法是在调用restoreViewState()之前清除package privatemsaveviewstate
字段:
package androidx.fragment.app;
import android.os.Bundle;
import android.view.View;
public class StatelessFragment extends Fragment {
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
mSavedViewState = null;
}
}
我有一个有3个选项卡的ViewPager。根据我所看到的情况,当容器活动开始时,前两个片段将处于恢复状态。我还注意到,只有并排的两个片段被恢复,第三个被停止。我遇到的问题是,我从网络加载数据用于第一个片段,并将自定义对象存储在一个ArrayList中,这很正常,但当我导航到第三个片段时,数据会随着第一个片段进入停止状态而丢失。因此,当从第三个片段导航回第一个片段时,ArrayList就会为空(我在
我有一个带有三个Fragments的,让我们称它们为A、B和C。A在活动中调用。 并在按下某些按钮时被替换为片段B或C,并且FragmentTransaction调用。 但是,假设我连续三次调用片段B,我如何防止它自己堆积到它身上呢?同时我希望这是可能的:B呼叫
嗨,伙计们,这是我的密码 我基本上只有2个碎片,只有家庭装饰应该添加到背面堆叠。在HomeFragment和OtherFragment之间切换了一段时间,然后在HomeFragment上单击back按钮,最后我会看到HomeFragment显示了好几次。在家庭框架内有一个回收视图。当我上下滚动时,我真的可以看到行显示了多次。我如何才能确保家庭装饰只添加到一次后堆栈。 谢谢
我们使用的是片段,我们不需要在重新创建活动时自动恢复它们。但是,Android每次调用->时,都会恢复片段,即使我们对这些片段使用setRetaInstance(false)。 附言。我们知道,在为配置更改重新创建活动的情况下,可以通过在manifest中添加来完成。但是,在自动清理内存的情况下,如何重新创建活动呢?
我在我的应用程序中使用导航栏,每次我选择一个项目时,它都会加载一个片段。 我能够使用相同的文本字段和按钮保存片段的状态,但有一个片段可以加载地图、添加标记、集群并执行。 每次我转到另一个菜单项并返回时,它都会重新加载所有内容,例如AsyncTask、Cluster、Markers。我如何停止此片段以不再重新创建地图并在返回时保存状态: Udate 1:我更新了代码,但问题仍然存在 主要活动: 主片
您好,我已经使用导航组件和导航图从一个片段导航到另一个片段,我想要的是防止onBack完全按下,这样当用户单击onBack时,应用程序将退出。我正在从注册片段导航到主页片段。 这是导航图中的代码 这是我的代码,当点击注册按钮时,在注册片段中导航