【发布时间】:2016-01-04 09:12:46
【问题描述】:
我正在开发一个自助服务终端应用程序,以便它接管平板电脑。带有一堆不同片段的单个活动。我在活动的 oncreate 中提交了一个片段。然后,当设备连接到蓝牙时,它将通过删除旧片段并添加新片段来加载新片段(调用函数 cancelFunc())。我遇到的问题是第一个片段在移除后仍然可见。我的日志显示它实际上已被删除,而是附加了一个新片段,但我看不到新片段或稍后附加的任何其他片段。但是,当我点击屏幕时,它会显示新片段。有点奇怪,我想知道我做错了什么。它只发生在活动的 oncreate 附加的片段上。代码相当长,所以我只向您展示几个重要部分。提前感谢您的帮助。
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.d(TAG, "onCreate()");
super.onCreate(savedInstanceState);
setContentView(R.layout.backbone);
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.add(R.id.fragmentContainer, new SystemDownFragment(), "SystemDownFragment");
ft.commit();
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
// If the adapter is null, then Bluetooth is not supported
if (mBluetoothAdapter == null) {
Log.d(TAG, "adapter is null");
Toast.makeText(this, "Bluetooth is not available", Toast.LENGTH_LONG).show();
finish();
}
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_IMMERSIVE);
}
public void cancelFunc() {
Log.d(TAG, "cancelFunc()");
removeFrag();
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.add(R.id.fragmentContainer, new StartupFragment(), "StartupFragment");
ft.commit();
getFragmentManager().executePendingTransactions();
}
private void removeFrag(){
Log.d(TAG, "removeFrag()" + getActiveFragments().size());
if(getActiveFragments().size() > 0) {
FragmentTransaction ft = getFragmentManager().beginTransaction();
for (int i = 0; i < getActiveFragments().size(); i++) {
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE);
ft.remove(getActiveFragments().get(i));
}
ft.commit();
}
}
@Override
public void onAttachFragment (Fragment fragment) {
Log.d(TAG, "onAttachFragment");
fragList.add(new WeakReference(fragment));
}
public List<Fragment> getActiveFragments() {
ArrayList<Fragment> ret = new ArrayList<Fragment>();
for(WeakReference<Fragment> ref : fragList) {
Fragment f = ref.get();
if(f != null) {
if(f.isVisible()) {
ret.add(f);
}
}
}
return ret;
}
我记录的数据显示如下:
MainActivity: onCreate()
MainActivity: onAttachFragment
MainActivity: onStart()
MainActivity: onResume()
MainActivity: Bluetooth Connected
MainActivity: cancelFunc()
MainActivity: removeFrag()1
MainActivity: onAttachFragment
【问题讨论】:
-
你能看到新片段吗?
-
使用 ft.replace(R.id.fragmentContainer, new StartupFragment(), "StartupFragment");而不是 ft.add();
-
在点击屏幕之前我看不到新片段。之后,它变得可见。对于我在整个代码中添加和删除的每个其他片段,这都没有问题。但是,活动 onCreate() 中的第一个片段存在问题。而且我一直在努力避免替换,因为我通常会同时连接一两个片段,而且我更容易在必要时将它们全部删除并添加新片段。