Nik*_*zic 2 android rotation fragment
我有简单的活动和片段交易。我注意到在Fragment的oncreateView上的配置更改被两次调用。为什么会这样呢?
活动代码在这里:
@Override
protected void onCreate(Bundle savedInstanceState) {
System.out.println("Activity created");
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
FragmentManager manager = getSupportFragmentManager();
BlankFragment fragment = new BlankFragment();
addFragmentToActivity(manager,
fragment,
R.id.root_activity_create
);
}
public static void addFragmentToActivity (FragmentManager fragmentManager,
Fragment fragment,
int frameId)
{
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.replace(frameId, fragment);
transaction.commit();
}
Run Code Online (Sandbox Code Playgroud)
片段代码在这里:
public class BlankFragment extends Fragment {
public BlankFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_blank, container, false);
}
}
Run Code Online (Sandbox Code Playgroud)
旋转后,Android 会自动恢复其视图的状态。您不必在旋转后再次调用 addFragmentToActivity。片段将自动为您恢复!
在您的情况下,它发生两次,因为: 1. Android 恢复片段,其 onCreateView 被称为 2. 您用自己的片段替换恢复的片段,该片段的 oncreateview 也被调用
做这个:
if (savedInstanceState == null)
{
addFragmentToActivity(manager, fragment, R.id.test);
}
Run Code Online (Sandbox Code Playgroud)
首次加载时onCreateView()调用一次
但是onRotation onCreateView()被调用了两次
为什么呢?
因为这个transaction.replace(frameId, fragment);真的吗?是的,我的意思是因为。fragment您在第一次加载时已经有一个片段,当您onCreate()再次旋转时,它将再次被调用,因此现在片段管理器中有旧的片段,因此它将执行(一次)方法,接下来您正在执行事务replace(),该事务将被删除旧的片段,并一次又一次地替换为新片段(onCreateView()将再次调用)。每旋转一次重复一次。
如果使用,transaction.add(frameId, fragment,UNIQUE_TAG_FOR_EVERY_TRANSACTION)您会知道原因。每次轮换,onCreateView()呼叫数量将增加1.,这意味着您在添加片段而不删除旧片段。
但是解决方案是使用旧片段。
在onCreate()活动中
val fragment = fragmentmanager.findFrgmentByTag("tag")
val newFragment : BlankFragment
if(fragment==null){
newFragment = BlankFragment()
}else{
newFragment = fragment as BlankFragment()
}
//use newFragment
Run Code Online (Sandbox Code Playgroud)
希望这能解决混乱
| 归档时间: |
|
| 查看次数: |
1210 次 |
| 最近记录: |