1

早上好。我正在开发一个应用程序,其中我有一个从活动扩展的主布局,在这个里面我有一个数据类型的片段,在我的例子中是 FragmentCover(它是一个类)。

在我的应用程序中,我按下一个按钮,我想将此片段布局更改为从片段扩展但类型不同的另一个布局,称为 SongList。

我的问题是我已经为 Cover 类定义了这个片段,当我更改时我没有任何问题,但是当我想获取视图并设置为我的类的一个变量时,songList = (ListView) getView().findViewById(R.id.songList);它的功能是 null 并且它给出我的错误。

我把它放在这里我做什么。

布局

<fragment android:name="es.xxx.ui.FragmentCover"
    android:id="@+id/pruebaa"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_above="@id/songBar"
    android:layout_below="@id/header"/>

主类变化

public void onClick(View v) {
if(isCoverFragment){
                FragmentSongList fragmentSongList = new FragmentSongList();
                transaction = getFragmentManager().beginTransaction();
                transaction.replace(R.id.pruebaa, fragmentSongList);
                transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
                transaction.addToBackStack("LIST");
                transaction.commit();
                isCoverFragment=false;
            }
            else{
                transaction = getFragmentManager().beginTransaction();
                transaction.replace(R.id.pruebaa, fragmentCover);
                transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
                transaction.addToBackStack("COVER");
                transaction.commit();
                getSongCover();
                isCoverFragment=true;
            }

问题不是变化,而是当我尝试创建 findViewById 时,可能是因为它没有加载与 FragmentSongList 关联的视图。

4

1 回答 1

2

您需要在布局文件中使用 FrameLayout,而不是在 .xml 中定义 Fragment

在那个 FrameLayout 中,你可以为你想要的任何 Fragment 充气。只需在 onCreate(...) 方法中直接膨胀您想要显示的第一个片段。

<FrameLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/content_frame"
        android:layout_width="match_parent"
        android:layout_height="match_parent">       
        </FrameLayout>

这是如何以编程方式将片段膨胀到 FrameLayout 中。

 FragmentSongList fragmentSongList = new FragmentSongList();
 FragmentTransaction transaction = getFragmentManager().beginTransaction();
         transaction.replace(R.id.content_frame, fragmentSongList);
         transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
         transaction.addToBackStack("LIST");
         transaction.commit();

您可以将代码原样保留在 onClick() 方法中,只需将 id 更改为“content_frame”。此外,如上所述,您必须对应该在 onCreate(...) 方法中显示的第一个 Fragment 进行膨胀。

于 2013-09-03T13:39:57.517 回答