Нулевой объект, являющийся дочерним элементом фрагмента

У меня есть Fragment который является частью ViewPager. В этом Fragment меня есть ViewGroup элемент ViewGroup. Теперь, почему в моем MainActivity onCreate() после создания экземпляра моего ViewPager и adapter мой 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
 ...
}

Вот Fragment который является частью ViewPager который содержит 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 -->
 </scrollview>

</framelayout>
1 ответ

Если я правильно читать ваш вопрос, вы пытаетесь получить доступ к Fragment View (и детей), используя Activity findViewById() метод. Это не должно работать, так как Fragment раздувает свой собственный макет и Fragments не являются традиционными Views.

Если вы знаете, что Fragment создан, и вы можете его восстановить, вы можете получить экземпляр ViewGroup используя

yourFragment#getView().findViewById()

Если нет, вы можете создать интерфейс, который реализует ваша Activity с помощью метода, который принимает в качестве аргумента ViewGroup. Затем в Fragment 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, Activity по-прежнему получает действительный экземпляр ViewGroup.

Или, если в зависимости от того, что вы на самом деле пытаетесь достичь с помощью этой ViewGroup, вы можете выполнить эту обработку внутри самого Fragment.

licensed under cc by-sa 3.0 with attribution.