空对象是片段的子对象

时间:2013-08-07 00:38:14

标签: android android-layout android-fragments android-viewpager viewgroup

我有Fragment,是ViewPager的一部分。在这个Fragment我有一个ViewGroup孩子。现在,为什么在我MainActivity onCreate() ViewPager实例化我的adapterContainer之后,我的null正在获得onCreate()

这是我的private MyAdapter mAdapter; private ViewPager mPager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mAdapter = new MyAdapter(getSupportFragmentManager()); mPager = (ViewPager) findViewById(R.id.pager); mPager.setAdapter(mAdapter); mContainerView = (ViewGroup) findViewById(R.id.container); //Here mContainerView is already null ... }

Fragment

以下ViewPagermContainerView的一部分,其中包含<?xml version="1.0" encoding="utf-8"?> <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"> <ScrollView android:layout_width="match_parent" android:layout_height="match_parent"> <!-- This is my ViewGroup --> <LinearLayout android:id="@+id/container" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:showDividers="middle" android:divider="?android:dividerHorizontal" android:animateLayoutChanges="true" android:paddingLeft="16dp" android:paddingRight="16dp" /> </ScrollView> <TextView android:id="@android:id/empty" style="?android:textAppearanceSmall" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:padding="32dp" android:text="@string/message_empty_layout_changes" android:textColor="?android:textColorSecondary" /> </FrameLayout>

{{1}}

1 个答案:

答案 0 :(得分:1)

如果我正确地阅读了您的问题,您正试图使用​​Fragment的{​​{1}}方法访问View的{​​{1}}(和孩子) 。这应该不起作用,因为Activity夸大了自己的布局,而findViewById() 不是传统的Fragment

如果您知道Fragments已实例化并且您可以检索它,则可以使用

获取Views的实例
Fragment

如果没有,您可以使用接受ViewGroup作为参数的方法创建yourFragment#getView().findViewById() 实现的接口。然后在Fragment的Activity中,让Fragment将ViewGroup传递给接口。您可以直接投射到onCreateView(),但界面更清晰。

例如

ViewGroup

}

您的Activity看起来像是:

public class Fragment {

 public interface ViewGroupCreateListener{

     public void onViewGroupCreated (ViewGroup v);
 }

 private ViewGroupCreateListener listener;

 public void onAttach (Activity a){
     super.onAttach (a);
     listener = (ViewGroupCreateListener) a;
 }

public View onCreateView (/*all its arguments here*/){
    View v = inflater.inflate (R.layout.your_layout);
    ViewGroup group = v.findViewById (R.id.container);
    listener.onViewGroupCreated(group);

    return v;
 }

这很好,因为如果寻呼机重新实例化Activity,则活动仍然会获得public class MainActivity extends Activity implements ViewGroupCreateListener, OtherInterface1, OtherInterface2{ private ViewGroup mViewGroup; public void onViewGroupCreated (ViewGroup v){ mViewGroup = v; } } 的有效实例。

,如果取决于您使用此Fragment实际尝试实现的目标,您可以在ViewGroup内部进行此处理。