如何在XML布局中添加一个片段

76

我有一个布局,其中包括以下片段:

<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() 以重新绘制任何更改。 - Tom Leese
5个回答

140

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

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

24
如果片段嵌套在另一个片段中,您需要使用 getChildFragmentManager() 而不是 getFragmentManager()。例如,在布局的 XML 中定义片段如下所示:

如果片段嵌套在另一个片段中,您需要使用 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()是因为我有嵌套的Fragment,谢谢兄弟。 - Mrinmoy
我的Fragment被嵌入到xml布局文件中,而该父Fragment加载它。 getChildFragmentManager对我有用,而getFragmentManager没有。谢谢! - TheZapper

4

我在安卓中做了同样的事情,最简单的方法是使用接口。我有一个包含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();
}

这个可以工作,但为了安全起见,您应该使用片段标签而不是循环。 - A. Steenbergen

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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接