我有一个FragmentViewPager的一部分。在这个Fragment中,我有一个ViewGroup孩子。现在,为什么在实例化MainActivityonCreate()后在ViewPageradapter中,我的Container正在获取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
    ...
}


这是包含FragmentViewPager的一部分中的mContainerView

<?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>

最佳答案

如果我正确地阅读了您的问题,则您正在尝试使用FragmentView方法访问ActivityfindViewById()(及其子级)。这不应该起作用,因为Fragment会夸大其自身的布局,并且Fragments不是传统的Views

如果您知道Fragment已实例化并且可以检索它,则可以使用以下方法获取ViewGroup的实例

yourFragment#getView().findViewById()


如果不是,则可以使用接受Activity作为参数的方法来创建ViewGroup实现的接口。然后在Fragment的onCreateView()中,让Fragment将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,则Activity仍将获得ViewGroup的有效实例。

或者,如果根据您实际使用此ViewGroup所要实现的目标,则可以在Fragment本身内部进行此处理。

10-08 08:53