Android:findFragmentById返回null

时间:2013-11-17 04:16:26

标签: android xml android-fragments

我正在使用ViewPager和我自己的PagerAdapter(注意:不使用FragmentPagerAdapter)。我试图通过我的Activity与我的片段进行通信,但是当我尝试获取对片段的引用时,它总是返回null。

这是我在自定义PagerAdapter中的实例化方法:

@Override
public Object instantiateItem(ViewGroup container, int position) {

    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View itemView = null;

    switch (position) {
    case 0:
        itemView = inflater.inflate(R.layout.left, container, false);
        break;
    case 1:
        itemView = inflater.inflate(R.layout.middle, container, false);
        break;
    case 2:
        itemView = inflater.inflate(R.layout.right, container, false);
        break;
    case 3:
        itemView = inflater.inflate(R.layout.right_right, container, false);
        break;
    }

    ((ViewPager) container).addView(itemView);
    return itemView;
}

这是我的mid.xml xml:

<?xml version="1.0" encoding="utf-8"?>
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
    android:name="com.example.testtabswipe.MiddleFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

</fragment>

这是我的MiddleFragment类的xml(filenmae:middle_fragment.xml):

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/middle_fragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#fff555" >


    <TextView 
        android:text="Testing some text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <GridView
        android:id="@+id/gridview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:verticalSpacing="0dp"
        android:horizontalSpacing="0dp"
        android:stretchMode="columnWidth"
        android:numColumns="2" 
        android:background="#fbb111" />

</RelativeLayout>

最后,这就是我在我的Activity中调用以获取片段的引用:

MiddleFragment middleFragment = (MiddleFragment) getSupportFragmentManager().findFragmentById(R.id.middle_fragment);
if(middleFragment == null)
    Log.d("Karl", "middleFragment Fragment null");
else
    Log.d("Karl", "middleFragment Fragment is not null");

它总是导致“middleFragment Fragment null”

有什么想法吗?

PS:这会影响所有片段而不仅仅是中间片段。

1 个答案:

答案 0 :(得分:0)

请查看我的回答here,以便与Fragment内的ViewPager进行通信。我们的想法是在适配器中设置要发送到Fragment的新数据,然后拨打notifyDataSetChanged(),然后调用getItemPosition()。从那里您可以参考Fragment

@Override
public int getItemPosition(Object object) {
    if (object instanceof UpdateableFragment) {
        ((UpdateableFragment) object).update(xyzData);
    }
    //don't return POSITION_NONE, avoid fragment recreation. 
    return super.getItemPosition(object);
}