早上好。我正在开发一个应用程序,该应用程序具有从活动扩展的主布局,并且在其中具有一个数据类型的一个片段,在我的情况下为FragmentCover(这是一个类)。

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

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

我把它放在这里做什么。

布局

<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相关联的视图。

最佳答案

您需要在布局文件中使用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。

10-06 06:35