我想将一个片段添加到以编程方式实现其布局的Activity.我查看了Fragment文档,但没有很多示例描述我需要的内容.这是我尝试编写的代码类型:
public class DebugExampleTwo extends Activity {
private ExampleTwoFragment mFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
FrameLayout frame = new FrameLayout(this);
if (savedInstanceState == null) {
mFragment = new ExampleTwoFragment();
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.add(frame.getId(), mFragment).commit();
}
setContentView(frame);
}
}
Run Code Online (Sandbox Code Playgroud)
...
public class ExampleTwoFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater,
ViewGroup container,
Bundle savedInstanceState) {
Button button = new Button(getActivity());
button.setText("Hello There");
return button;
}
}
Run Code Online (Sandbox Code Playgroud)
此代码编译但在开始时崩溃,可能是因为我FragmentTransaction.add()的错误.这样做的正确方法是什么?
我在下面有简单的代码
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.fragment_container, mFeedFragment);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
Run Code Online (Sandbox Code Playgroud)
这些代码行做了什么?
android fragmenttransaction fragmentmanager fragment-backstack
我的项目包含两个片段:
fragmentA单击按钮完成时的操作.这是我主视图的XML:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<fragment
android:id="@+id/main_fragment_container"
android:name="fragmentA"
android:layout_width="match_parent"
android:layout_height="match_parent">
</fragment>
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
当我想以取代FragmentA由FragmentB,我用这个代码:
FragmentTransaction fragmentTransaction = getSupportFragmentManager()
.beginTransaction();
fragmentTransaction.addToBackStack(null);
fragmentTransaction.replace(R.id.main_fragment_container, new FragmentB());
fragmentTransaction.commit();
Run Code Online (Sandbox Code Playgroud)
这段代码工作正常.我的FragmentA被新的替换FragmentB.但是,当点击上后退按钮做的,我希望更换FragmentB被FragmentA使用popBackStackImmediate().
这是我使用的代码:
if (getSupportFragmentManager().getBackStackEntryCount() > 0){
boolean done = getFragmentManager().popBackStackImmediate();
fragmentTransaction.commit();
}
Run Code Online (Sandbox Code Playgroud)
该函数popBackStackImmediate返回false并且FragmentB仍处于前台.
我打电话时为什么FragmentA不会替换FragmentB popBackStackImmediate?有人有想法解决我的问题吗?
提前致谢
我正在研究碎片,并且在区分FragmentTransaction.replace(id, fragment, tag)和FragmentTransaction.addToBackStack(tag)调用时很少感到困惑.让我们说我当前的片段是FragmentA,然后我加载了FragmentB.我希望将来,当我需要加载FragmentA时,我不必重新加载它.只需在旧状态下加载旧的.我使用了以下代码段:
public void loadFragment(Fragment fragmentB, String tag) {
FragmentManager fm = getSupportFragmentManager();
View fragmentContainer = findViewById(R.id.fragment_container);
FragmentTransaction ft = fm.beginTransaction();
ft.replace(fragmentContainer.getId(), fragmentB, tag);
ft.addToBackStack(tag);
ft.commit();
}
Run Code Online (Sandbox Code Playgroud)
现在我很困惑,我应该在哪里添加字符串标签?在replace()或addToBackStack()或在两个电话?你能解释这两个标签位置之间的区别吗?
android ×4