android-fragments 获取片段名称或ID

a5g8bdjr  于 2022-11-13  发布在  Android
关注(0)|答案(7)|浏览(193)

我有一个framelayout,在我的Activity中调用一次,在其他Fragment中调用不同的时间(经过Activity的同一个framelayout)。
在我的MainActivity.class中,我需要知道我的framelayout在哪个片段中,例如,我需要知道framelayout使用的是MyFragment1.class还是MyFragment2.class
我需要这样的东西(在这个例子中,log必须说me “you are in MyFragment1”):

FrameLayout frameLayout = (FrameLayout) findViewById(R.id.framelayout);

 getSupportFragmentManager().beginTransaction()
        .replace(R.id.framelayout,new MyFragment1())
        .commit();

if (framelayout.getname.equals("package.MyFragment1.class"))
 Log.d("debug", "you are in MyFragment1");
else if (framelayout.getname.equals("package.MyFragment2.class"))
 Log.d("debug", "you are in MyFragment2");

我怎么能那样做呢?

sigwle7e

sigwle7e1#

您需要使用以下代码从FrameLayout获取运行时片段

Fragment fragmentInFrame = (Fragemnt)getSupportFragmentManager()
                                             .findFragmentById(R.id.frag2_view);

然后使用instanceof检查片段类型

if (fragmentInFrame instanceof MyFragment1){

   Log.d("debug", "you are in MyFragment1");

}else if (fragmentInFrame instanceof MyFragment2){

    Log.d("debug", "you are in MyFragment2");

}
a2mppw5e

a2mppw5e2#

"我找到了解决之道"

getSupportFragmentManager().beginTransaction()
     .replace(R.id.framelayout,new MyFragment1())
     .commit();

final Fragment fragmentInFrame = getSupportFragmentManager().findFragmentById(R.id.framelayout);

if (fragmentInFrame instanceof MyFragment1){
      Log.d("debug", "you are in MyFragment1");
} else if (fragmentInFrame instanceof MyFragment2) {
      Log.d("debug", "you are in MyFragment2");
}
vlf7wbxs

vlf7wbxs3#

您需要使用以下示例进行检查
你需要检查你的fragment对象:

public Fragment getVisibleFragment(){
   FragmentManager fragmentManager = MainActivity.this.getSupportFragmentManager();
   List<Fragment> fragments = fragmentManager.getFragments();
   if(fragments != null){
    for(Fragment fragment : fragments){
        if(fragment != null && fragment.isVisible())
            return fragment;
    }
   }
   return null;
 }

fragment = getVisibleFragment();
if (fragment instance of MyFragment1){

}
ergxz8rk

ergxz8rk4#

我有一个ContentFrameLayout这个ID是Fragment_Main
您可以使用FrameLayout
Activity写这个代码

final Fragment fragmentInFrame = getSupportFragmentManager().findFragmentById(R.id.Fragment_Main);

if(fragmentInFrame instanceof YourFragment){

}

Fragment写入此代码

final Fragment fragmentInFrame =getActivity().getSupportFragmentManager().findFragmentById(R.id.Fragment_Main);

if(fragmentInFrame instanceof YourFragment){

}
yx2lnoni

yx2lnoni5#

final Fragment fragmentInFrame = getSupportFragmentManager().findFragmentById(R.id.framelayout);

getSupportFragmentManager().beginTransaction()
     .replace(R.id.framelayout, new MyFragment1())
     .commit();

您正在替换此处的片段。因此fragmentInFrame仍将引用旧片段。
因此,在替换之后,您需要通过再次查找来更新fragmentInFrame变量。

fragmentInFrame = getSupportFragmentManager().findFragmentById(R.id.framelayout);

现在,检查fragmentInFrame将起作用。
不要忘记删除final关键字。

fjnneemd

fjnneemd6#

在你的每一个Fragment类中,只需在onCreateView方法里面定义Log。

uelo1irk

uelo1irk7#

接受来自@Jéwôm的答案'在我这里确实能正常工作。注意,您必须指定root_framelayout R.id FrameLayout来保存所有片段并实现非弃用的androidx方法
这是onPreferenceStartFragment()中使用的id:

getSupportFragmentManager().beginTransaction()
            .replace(R.id.root_framelayout, fragment)
            .addToBackStack(null)
            .commit();

相关问题