【问题标题】:Get the fragment name or id获取片段名称或 id
【发布时间】:2017-02-24 13:03:05
【问题描述】:

我有一个framelayout 在我的Activity 中调用一次,在其他Fragment 中调用了多次(经过Activity 的同一个framelayout)。

在我的MainActivity.class 中,我需要知道我的framelayout 在哪个片段中。 例如,我需要知道framelayout 使用的是MyFragment1.class 还是MyFragment2.class。

我需要这样的东西(在这个例子中,log 必须说我“你在 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");

我该怎么做?

【问题讨论】:

  • 查看片段管理器的标签名称
  • 查看我发布的答案
  • 我尝试了您的解决方案,但它不起作用(查看我的编辑)

标签: java android android-fragments android-framelayout


【解决方案1】:

您需要使用以下代码从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");

}

【讨论】:

  • 我尝试了您的解决方案,但它不起作用(查看我的编辑)
【解决方案2】:

我找到了解决办法

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");
}

【讨论】:

    【解决方案3】:

    您需要使用类似的实例进行检查

    您需要检查您的片段对象:

     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){
    
    }
    

    【讨论】:

    • 我尝试了类似的解决方案,但它不起作用(查看我的编辑)
    • 你先拿到片段对象了吗?然后在您需要检查实例之后...
    • 是的,最终 Fragment fragmentInFrame = getSupportFragmentManager().findFragmentById(R.id.framelayout);
    • 那么您的实例是 MyFragment1 的类,否则它将不执行。
    【解决方案4】:

    我有一个 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){
    
    }
    

    【讨论】:

      【解决方案5】:
      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 关键字。

      【讨论】:

        【解决方案6】:

        在您的每个 Fragment 类中,只需在 onCreateView 方法中定义 Log。

        【讨论】:

          猜你喜欢
          • 2016-12-04
          • 1970-01-01
          • 2016-06-09
          • 2011-07-28
          • 1970-01-01
          • 2019-10-10
          • 2015-10-19
          • 2013-03-30
          • 1970-01-01
          相关资源
          最近更新 更多