如何获取在XML布局中添加的片段


73

我有一个包含以下片段的布局:

<fragment
        android:id="@+id/mainImagesList"
        android:name="com.guc.project.ImagesList"
        android:layout_width="match_parent"
        android:layout_height="62dp"
        android:layout_below="@+id/addimagebutton"
        android:layout_weight="1"
        android:paddingTop="55dp" />

现在,我需要获取此片段并将其投射,以便可以对其进行操作并显示更新。我该怎么办?

编辑:我想我已经设法获取片段,但是当我更改一些变量时,更改不会出现!


如果未出现更改,请尝试在视图上调用invalidate()以重新绘制所有更改。
汤姆·利斯

Answers:


138

您可以按以下方式获取片段实例:

getSupportFragmentManager().findFragmentById(R.id.yourFragmentId)

22

如果片段嵌入到另一个片段,你需要getChildFragmentManager()但不是getFragmentManager()。例如,在布局xml中定义如下片段:

<fragment 
    android:name="com.aventlabs.ChatFragment"
    android:id="@+id/chatfragment"
    android:background="#ffffff"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_weight="1"
    android:layout_marginTop="50dp"
    android:layout_marginLeft="5dp"
    android:layout_marginRight="5dp" />

在代码中,您可以这样获得片段实例:

FragmentManager f = getChildFragmentManager();
FragmentTransaction transaction = f.beginTransaction();
chatFragment = f.findFragmentById(R.id.chatfragment);

if (chatFragment != null) {
   transaction.hide(chatFragment);
}
transaction.commit();

1
getChildFragmentManager()做到了,就像我嵌套了片段一样,谢谢兄弟
Mrinmoy

我的片段嵌入在父片段加载的xml布局文件中。getChildFragmentManager对我有用,而getFragmentManager没有。谢谢!
TheZapper

4

我在android中做过完全相同的事情,也是使用接口做到这一点的最简单方法。我有一个包含6个片段的活动,我只需要更新3个片段。

我用这个

    final Integer numeroFragments = ((PagerAdapterOfe) mViewPager.getAdapter()).getCount();

    for (int i=0; i<numeroFragments; i++) {
        Object fragment = ((PagerAdapterOfe) mViewPager.getAdapter()).getItem(i);

        // If the fragment implement my interface, update the list
        if (fragment instanceof IOfertaFragment){
        ((IOfertaFragment) fragment).actualizaListaOfertas();
        }
    }

其中,PageAdapterOfe是我的活动片段适配器。我循环我所有的片段并搜索实现我的接口的那些片段,当我发现一个片段时,我执行我的接口定义的方法,那就是!

我在包含所有片段的活动中使用此代码,作为广播信号的响应,您可以将其放在所需的位置。

界面:

public interface IOfertaFragment {

    public void actualizaListaOfertas();
}

这是可行的,但是为了安全起见,您应该使用fragment标签而不是循环。
A. Steenbergen'2

1

您可以使用findFragmentById(如果您知道它所包含的组件)或findFragmentByTag(如果您知道其标签)来找到该片段。

我不知道要更新哪些变量,但是您可以使用FragmentTransaction API用另一个片段替换该片段。

有关示例,请参见http://developer.android.com/guide/components/fragments.html


如果片段不是在布局中绘制的,而只是在xml中使用片段标记声明的,则替换片段将不起作用。
AouledIssa

1

如果Fragment包含在Activity的布局文件中,则SupportFragmentManager可以引用它,例如...

MyFragment myFragment= (MyFragment)getSupportFragmentManager().findFragmentById(R.id.FRAGMENTID)

如果Fragment包含在另一个Fragment的布局文件中,则可以由ChildFragmentManager引用,例如...

 MyFragment myFragment= (MyFragment)getChildFragmentManager().findFragmentById(R.id.FRAGMENTID)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.