我尝试在片段之间进行导航。我得到了NewFragment.java
新片段的工作原理。我的问题是:
如何正确运行此onClickListener
NewFragment.java
?
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(getActivity(), NewFragment.class);
startActivity(i);
}
});
仅供参考:这是来自一个片段(我不知道这是否重要)。
答案 0 :(得分:107)
在点击侦听器功能中添加以下代码
NextFragment nextFrag= new NextFragment();
getActivity().getSupportFragmentManager().beginTransaction()
.replace(R.id.Layout_container, nextFrag, "findThisFragment")
.addToBackStack(null)
.commit();
如果需要,可以使用字符串"findThisFragment"
稍后查找该片段。
答案 1 :(得分:5)
这是@ Narendra代码的更多描述代码,
首先,您需要第二个片段的实例。那么你应该有FragmentManager和FragmentTransaction的对象。完整的代码如下,
Fragment2 fragment2=new Fragment2();
FragmentManager fragmentManager=getActivity().getFragmentManager();
FragmentTransaction fragmentTransaction=fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.content_main,fragment2,"tag");
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
希望这会奏效。有时你可能会得到getSupportFragmentManager()而不是getFragmentManager()。
答案 2 :(得分:3)
你应该在activity中创建一个函数来打开新的片段并将活动引用传递给片段,并在片段内的一些事件中调用这个函数。
答案 3 :(得分:2)
使用Kotlin将Fragment
的{{1}}替换为container
,您可以完成
button.setOnClickListener {
activity!!
.supportFragmentManager
.beginTransaction()
.replace(R.id.container, NewFragment.newInstance())
.commitNow()
}
答案 4 :(得分:1)
@Override
public void onListItemClick(ListView l, View v, int pos, long id) {
super.onListItemClick(l, v, pos, id);
UserResult nextFrag= new UserResult();
this.getFragmentManager().beginTransaction()
.replace(R.id.content_frame, nextFrag, null)
.addToBackStack(null)
.commit();
}
答案 5 :(得分:0)
使用此,
AppCompatActivity activity = (AppCompatActivity) view.getContext();
Fragment myFragment = new MyFragment();
activity.getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, myFragment).addToBackStack(null).commit();
答案 6 :(得分:0)
Fragment fr = new Fragment_class();
FragmentManager fm = getFragmentManager();
FragmentTransaction fragmentTransaction = fm.beginTransaction();
fragmentTransaction.add(R.id.viewpagerId, fr);
fragmentTransaction.commit();
准确地说,R.id.viewpagerId
在您当前的类布局中被创建,在调用时,新片段会自动渗透。
答案 7 :(得分:0)
正在添加到@Narendra解决方案...
重要提示:在处理片段时,导航与主机活动密切相关,因此,如果不在主机Activity中实现该片段类,就无法从一个片段跳转到另一个片段。
示例:
public class MyHostActivity extends AppCompatActivity implements MyFragmentOne.OnFragmentInteractionListener {
还要检查您的主机活动是否具有下一个覆盖功能:
@Override
public void onFragmentInteraction(Uri uri) {}
希望这会有所帮助...
答案 8 :(得分:0)
好吧,我的问题是我使用了答案中的代码,此处将其作为解决方案进行检查,但是执行替换后,第一层仍然可见,并且仅在打开的片段下起作用。我的解决方案很简单,我添加了
.remove(CourseListFragment.this)
CourseListFragment是我尝试关闭的片段的类文件。 (MainActivity.java,但对于特定部分(导航抽屉片段),如果它对您更有意义) 所以我的代码现在看起来像这样:
LecturesFragment nextFrag= new LecturesFragment();
getActivity().getSupportFragmentManager().beginTransaction()
.remove(CourseListFragment.this)
.replace(((ViewGroup)getView().getParent()).getId(), nextFrag, "findThisFragment")
.addToBackStack(null)
.commit();
对我来说,它就像是一种魅力。
答案 9 :(得分:0)
首先,为您的Fragment布局设置ID,例如:
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
**android:id="@+id/cameraFragment"**
tools:context=".CameraFragment">
并使用该ID将视图替换为另一个fragment.java文件。例如
ivGallary.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
UploadDoc uploadDoc= new UploadDoc();
(getActivity()).getSupportFragmentManager().beginTransaction()
.replace(**R.id.cameraFragment**, uploadDoc, "findThisFragment")
.addToBackStack(null)
.commit();
}
});
答案 10 :(得分:0)
对于 Kotlin,你可以简单地使用它,
首先:创建片段的新实例
val newFragment = NewFragment.newInstance()
第二:启动分片交易
val fragmentTransaction: FragmentTransaction = activity!!.supportFragmentManager.beginTransaction()
第三:用新片段替换当前片段 (提示:避免使用容器视图的 id,如 R.id.fl_fragment,你可能会遇到 view not find 错误,使用如下所述)
fragmentTransaction.replace(
(view!!.parent as ViewGroup).id,newFragment
)
最后的步骤:
fragmentTransaction.addToBackStack(null)
fragmentTransaction.commit()
答案 11 :(得分:0)
一个简单的选择是通过在 nav_graph.xml
中定义一个操作来导航到第二个片段,然后像这样使用它(Kotlin 的示例):
rootViewOfFirstFragment.someBtn.setOnClickListener{
Navigation.findNavController(rootViewOfFirstFragment)
.navigate(R.id.action_firstFragment_to_secondFragment)
}