Android将当前片段替换为另一个片段
我刚开始为蜂巢设计碎片。我创建了两个片段。当我单击左侧片段中的一个按钮时,右侧将创建一个新片段。同时,当我单击右侧片段中的按钮时(即,下面代码中的DetialsFragment应该被另一个片段替换)。 main.xml Titles.javaAndroid将当前片段替换为另一个片段,android,android-3.0-honeycomb,android-fragments,Android,Android 3.0 Honeycomb,Android Fragments,我刚开始为蜂巢设计碎片。我创建了两个片段。当我单击左侧片段中的一个按钮时,右侧将创建一个新片段。同时,当我单击右侧片段中的按钮时(即,下面代码中的DetialsFragment应该被另一个片段替换)。 main.xml Titles.java public class Titles extends Fragment { public FragmentTransaction ft; @Override public View onCreateView(LayoutInfla
public class Titles extends Fragment {
public FragmentTransaction ft;
@Override
public View onCreateView(LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.main1, null);
Button button1 = (Button)v.findViewById(R.id.button1);
button1.setText("santhosh");
button1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
DetailsFragment details = (DetailsFragment)
getFragmentManager().findFragmentById(R.id.details);
if (details == null || details.getShownIndex() != 1) {
// Make new fragment to show this selection.
details = DetailsFragment.newInstance(1);
// Execute a transaction, replacing any existing
// fragment with this one inside the frame.
ft
= getFragmentManager().beginTransaction();
ft.add(R.id.details, details, "detail");
ft.setTransition(
FragmentTransaction.TRANSIT_FRAGMENT_FADE);
ft.commit();
}
}
});
return v;
}
}
DetailsFragment.java
public class DetailsFragment extends Fragment {
/**
* Create a new instance of DetailsFragment, initialized to
* show the text at 'index'.
*/
Titles title = new Titles();
String[] titles = {"Title1", "Title2", "Title3", "Title4"};
public static DetailsFragment newInstance(int index) {
DetailsFragment f = new DetailsFragment();
// Supply index input as an argument.
Bundle args = new Bundle();
args.putInt("index", index);
f.setArguments(args);
return f;
}
public int getShownIndex() {
return getArguments().getInt("index", 0);
}
@Override
public View onCreateView(LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
if (container == null) {
// Currently in a layout without a container, so no
// reason to create our view.
return null;
}
Button button = new Button(getActivity());
button.setText("Next");
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
}
});
return button;
}
}
然后,如果显示了按钮并且触发了click事件,则可以在click事件中调用以下命令:
final FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.details, new NewFragmentToReplace(), "NewFragmentTag");
ft.commit();
如果要在单击“上一步”时返回DetailsFragment,请确保将上述事务添加到后堆栈中,即
ft.addToBackStack(null);
或者我遗漏了什么?或者有些人建议您的活动获取按钮的单击事件,并负责替换详细信息窗格中的片段。您可以尝试下面的代码。这是从旧片段推送新片段的非常简单的方法
private int mContainerId;
private FragmentTransaction fragmentTransaction;
private FragmentManager fragmentManager;
private final static String TAG = "DashBoardActivity";
public void replaceFragment(Fragment fragment, String TAG) {
try {
fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(mContainerId, fragment, tag);
fragmentTransaction.addToBackStack(tag);
fragmentTransaction.commitAllowingStateLoss();
} catch (Exception e) {
// TODO: handle exception
}
}
使用
android.support.v4.app
进行FragmentManager和FragmentTransaction在您的代码中,它对我有效
DetailsFragment detailsFragment = new DetailsFragment();
android.support.v4.app.FragmentManager fragmentManager = getSupportFragmentManager();
android.support.v4.app.FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.details,detailsFragment);
fragmentTransaction.commit();
如何替换为片段非常简单
DataFromDb changeActivity = new DataFromDb();
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.changeFrg, changeActivity);
transaction.commit();
如果你有一个现有片段的句柄,你可以用片段的ID替换它 科特林的例子:
fun aTestFuction() {
val existingFragment = MyExistingFragment() //Get it from somewhere, this is a dirty example
val newFragment = MyNewFragment()
replaceFragment(existingFragment, newFragment, "myTag")
}
fun replaceFragment(existing: Fragment, new: Fragment, tag: String? = null) {
supportFragmentManager.beginTransaction().replace(existing.id, new, tag).commit()
}
最新资料
好的。这是一个非常古老的问题,从那时起有很好的答案。但从那时起,很多事情都发生了变化
现在,在2020年,如果您正在与Kotlin合作,并且希望更改片段,那么您可以执行以下操作
build.gradle
文件中添加以下内容:
dependencies {
def fragment_version = "1.2.5"
// Kotlin
implementation "androidx.fragment:fragment-ktx:$fragment_version"
// Testing Fragments in Isolation
debugImplementation "androidx.fragment:fragment-testing:$fragment_version"
}
supportFragmentManager.commit {
replace(R.id.frame_layout, YourFragment.newInstance(), "Your_TAG")
addToBackStack(null)
}
参考资料
更新的答案(也适用于重叠问题)
@aniket-thakur()给出了正确的答案。谢谢
但是,getFragmentManager()
已被弃用,所以下面的代码确实对我有用
final FragmentTransaction ft = getParentFragmentManager().beginTransaction();
ft.replace(R.id.nav_host_fragment, new GalleryFragment(), "NewFragmentTag");
ft.addToBackStack(null);
ft.commit();
提供片段标记是可选的。您可以执行
ft.replace(R.id.details,new newfragmentoreplace());
也不要忘记getFragmentManager().executePendingTransactions())
按钮不会离开上一个片段。旧片段的按钮仍然可以在新片段的顶部看到。是什么mcontainerid@Ayoub是u视图id..example linearLayout.getId()在Java中,从今天起,这适用于Kotlin,只需在此处将该版本替换为当前版本https://developer.android.com/jetpack/androidx/releases/fragment
supportFragmentManager.commit {
replace(R.id.frame_layout, YourFragment.newInstance(), "Your_TAG")
addToBackStack(null)
}
final FragmentTransaction ft = getParentFragmentManager().beginTransaction();
ft.replace(R.id.nav_host_fragment, new GalleryFragment(), "NewFragmentTag");
ft.addToBackStack(null);
ft.commit();