获取当前片段对象

Lab*_*lan 168 android android-fragments

在我的main.xml

  <FrameLayout
        android:id="@+id/frameTitle"
        android:padding="5dp"
        android:layout_height="wrap_content"
        android:layout_width="fill_parent"
        android:background="@drawable/title_bg">
            <fragment
              android:name="com.fragment.TitleFragment"
              android:id="@+id/fragmentTag"
              android:layout_width="fill_parent"
              android:layout_height="wrap_content" />

  </FrameLayout>
Run Code Online (Sandbox Code Playgroud)

我正在设置像这样的片段对象

FragmentManager fragmentManager = activity.getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
Fragment newFragment = new FragmentType1();
fragmentTransaction.replace(R.id.frameTitle, casinodetailFragment, "fragmentTag");

// fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
Run Code Online (Sandbox Code Playgroud)

FragmentType2,FragmentType3,...在不同的时间设置不同类型的Fragment对象().现在在某个时间点我需要确定当前存在哪个对象.

,我需要做这样的事情:

Fragment currentFragment = //what is the way to get current fragment object in FrameLayout R.id.frameTitle
Run Code Online (Sandbox Code Playgroud)

我尝试了以下内容

TitleFragment titleFragmentById = (TitleFragment) fragmentManager.findFragmentById(R.id.frameTitle);
Run Code Online (Sandbox Code Playgroud)

    TitleFragment titleFragmentByTag = (TitleFragment) fragmentManager.findFragmentByTag("fragmentTag");
Run Code Online (Sandbox Code Playgroud)

但是两个对象(titleFragmentById和titleFragmentByTag)都是null
我错过了什么吗?
我正在使用Compatibility Package, r3和开发API level 7.

findFragmentById()并且findFragmentByTag()如果我们使用fragmentTransaction.replace或设置片段将会工作fragmentTransaction.add,但是return null如果我们将对象设置为xml(就像我在我的工作中那样main.xml).我想我的XML文件中缺少一些东西.

Com*_*are 248

现在在某个时间点我需要确定当前存在哪个对象

呼叫findFragmentById()FragmentManager并确定哪些片段是在你的R.id.frameTitle容器.

  • @Labeeb P:您无法修改布局资源中声明的片段. (9认同)
  • 感谢您的答复。如果我们使用 `fragmentTransaction.replac`e 或 `fragmentTransaction.add` 设置了片段,它将起作用,但如果我们在 xml 中设置它,则不会得到。查看我的编辑 2 (2认同)

Ham*_*mer 106

试试这个,

Fragment currentFragment = getActivity().getFragmentManager().findFragmentById(R.id.fragment_container);
Run Code Online (Sandbox Code Playgroud)

这将给你当前片段,然后你可以将它与片段类进行比较并做你的事情.

    if (currentFragment instanceof NameOfYourFragmentClass) {
     Log.v(TAG, "find the current fragment");
  }
Run Code Online (Sandbox Code Playgroud)

  • 有时您必须使用`getSupportFragmentManager()`代替,并且在没有`support`部分的情况下将获得null (8认同)

小智 37

我认为你可以使用onAttachFragment事件可能有助于捕获哪个片段是活动的.

@Override
public void onAttachFragment(Fragment fragment) {
    // TODO Auto-generated method stub
    super.onAttachFragment(fragment);

    Toast.makeText(getApplicationContext(), String.valueOf(fragment.getId()), Toast.LENGTH_SHORT).show();

}
Run Code Online (Sandbox Code Playgroud)

  • 这不起作用,因为它在您返回时不会更新活动片段. (7认同)
  • 我能够得到我附加的片段.我的想法是当我改变方向然后我需要显示相同的视图而不是另一个视图,所以如何做到这一点. (3认同)

Niq*_*iqo 12

我认为你应该这样做:

Fragment currentFragment = fragmentManager.findFragmentByTag("fragmentTag");
Run Code Online (Sandbox Code Playgroud)

原因是因为您将标签"fragmentTag"设置为您添加的最后一个片段(当您调用replace时).

  • 这个解决方案是不是意味着你必须为多个片段放置相同的标签?否则你怎么知道`fragmentTag`是当前片段的标签? (2认同)

elu*_*eci 10

您可以获取片段列表并查看最后一个片段.

    FragmentManager fm = getSupportFragmentManager();
    List<Fragment> fragments = fm.getFragments();
    Fragment lastFragment = fragments.get(fragments.size() - 1);
Run Code Online (Sandbox Code Playgroud)

但有时(当您向后导航时)列表大小保持不变,但最后一些元素为空.所以在列表中我迭代到最后一个非null片段并使用它.

    FragmentManager fm = getSupportFragmentManager();
    if (fm != null) {
        List<Fragment> fragments = fm.getFragments();
        if (fragments != null) {
            for(int i = fragments.size() - 1; i >= 0; i--){
                Fragment fragment = fragments.get(i);
                if(fragment != null) {
                    // found the current fragment

                    // if you want to check for specific fragment class
                    if(fragment instanceof YourFragmentClass) {
                        // do something
                    }
                    break;
                }
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

  • 不要使用`getFragments()`方法.它标有`@ hide`,不应该包含在支持库jar中.它不应被视为导出API的一部分. (3认同)

小智 10

这是最简单的解决方案,对我有用.

1.)你添加你的片段

ft.replace(R.id.container_layout, fragment_name, "fragment_tag").commit();
Run Code Online (Sandbox Code Playgroud)

2.)

FragmentManager fragmentManager = getSupportFragmentManager();

Fragment currentFragment = fragmentManager.findFragmentById(R.id.container_layout);

if(currentFragment.getTag().equals("fragment_tag"))

{

 //Do something

}

else

{

//Do something

}
Run Code Online (Sandbox Code Playgroud)


Ahm*_*sir 9

可能会迟到但我希望它可以帮助其他人,同时@CommonsWare也发布了正确答案.

FragmentManager fm = getSupportFragmentManager();
Fragment fragment_byID = fm.findFragmentById(R.id.fragment_id);
//OR
Fragment fragment_byTag = fm.findFragmentByTag("fragment_tag");
Run Code Online (Sandbox Code Playgroud)

  • 这不允许您获取活动片段,因为您不一定知道id或标记. (8认同)

mad*_*adx 6

也许最简单的方法是:

public MyFragment getVisibleFragment(){
    FragmentManager fragmentManager = MainActivity.this.getSupportFragmentManager();
    List<Fragment> fragments = fragmentManager.getFragments();
    for(Fragment fragment : fragments){
        if(fragment != null && fragment.getUserVisibleHint())
            return (MyFragment)fragment;
    }
    return null;
}
Run Code Online (Sandbox Code Playgroud)

它对我有用


bux*_*xik 5

您可以在父活动类中创建字段:

public class MainActivity extends AppCompatActivity {

    public Fragment fr;

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

}
Run Code Online (Sandbox Code Playgroud)

然后在每个片段类中:

public class SomeFragment extends Fragment {

@Override
    public View onCreateView(LayoutInflater inflater,
                             ViewGroup container, Bundle savedInstanceState) {

        ((MainActivity) getActivity()).fr = this;
}
Run Code Online (Sandbox Code Playgroud)

您的“ fr”字段是当前片段对象

它也与popBackStack()一起工作