Переход от одного ListFragment к другому - PullRequest
0 голосов
/ 26 марта 2012

Я пытаюсь создать базовое приложение на основе ListFragment, которое переходит от одного ListFragment к другому на основе пользовательского ввода.

Я использую значение по умолчанию ListView, которое система Android надувает для ListFragment, поэтому я не переигрываю onCreateView().

Чтобы установить поля вокруг ListFragment, я добавляю GlobalLayoutListener.

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

Но как только я щелкаю изображение в основном макете, которое вызывает переход ко второму фрагменту, имеющему тот же метод onActivityCreated() и GlobalLayoutListener в качестве первого фрагмента, я получаю страшную ошибку Content View not created yet в OnGlobalLayout() метод, когда я пытаюсь получить доступ к ListView во втором фрагменте.

public void onActivityCreated(Bundle savedInstanceState){

     super.onActivityCreated(savedInstanceState);



     setListAdapter(new ArrayAdapter<String>(getActivity(),
                    R.layout.listcommon, R.id.label, MAIN_TITLES));




     ListView lv = getListView();

     lv.setDivider(null);
     lv.setDividerHeight(0);
     lv.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
     lv.setItemChecked(0, true);
     lv.setSelection(0);



     ViewTreeObserver observer = getListView().getViewTreeObserver();

     observer.addOnGlobalLayoutListener(fragmentLayoutListener);

}

ViewTreeObserver.OnGlobalLayoutListener fragmentLayoutListener = new   ViewTreeObserver.OnGlobalLayoutListener(){

    public void onGlobalLayout() {

    //Crashes here for second fragment   
    ListView listView = getListView();

    FrameLayout.LayoutParams params = (LayoutParams) listView.getLayoutParams();

    params.setMargins(10, 10, 10, 10);

    }

};

Вот основной макет: (Фрагмент по умолчанию добавляется через FragmentTransaction.add() к первому FrameLayout)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent" 
android:layout_height="match_parent"
android:baselineAligned="false"
android:background="#00000000">


<FrameLayout
    android:id="@+id/TitlesContainer"
    android:layout_width="match_parent"
    android:layout_height="0px"
    android:layout_weight="40"
    android:layout_margin="10dip"
    android:background="@drawable/titlesbg"
    >


</FrameLayout>


<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="0px"
    android:layout_weight="60"
    android:background="#00000000"
    >

<ImageView
    android:id="@+id/imageView_clickWheel"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:src="@drawable/clickImage" />

</FrameLayout>


</LinearLayout>

Любые мысли о том, что я должен делать, чтобы избежать этой ошибки?

Должен ли я переиграть onCreateView() в конце концов и раздуть пользовательский список (но у меня нет такой необходимости)?

EDIT:

Вот как я добавляю фрагмент по умолчанию к основной активности onCreate():

    FragmentManager fragmentManager = getFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    TitlesFragment fragment = (TitlesFragment) fragmentManager.findFragmentByTag(MAIN_SCREEN_TAG);
    if (fragment == null){
        fragment = TitlesFragment.newInstance(SCREEN_MAIN);
        fragmentTransaction.add(R.id.TitlesContainer, fragment, MAIN_SCREEN_TAG);

    } else {    
        fragmentTransaction.add(R.id.TitlesContainer, fragment);
    }

    fragmentTransaction.commit();

Чтобы выполнить переход, вот что я делаю:

    fragment = (TitlesFragment) fragmentManager.findFragmentByTag(SECOND_FRAGMENT_TAG);
                if (fragment == null){

                    fragment = TitlesFragment.newInstance(SECOND_FRAGMENT);
                    fragmentTransaction.replace(R.id.TitlesContainer, fragment, SECOND_FRAGMENT_TAG);
                } else {
                    fragmentTransaction.replace(R.id.TitlesContainer, fragment);
                }
    fragmentTransaction.commit();

Ответы [ 2 ]

0 голосов
/ 27 марта 2012

Я избавился от OnGlobalLayoutListener.Вместо этого я установил атрибут 'layout_padding' в первом FrameLayout, чтобы установить поля для фрагмента, который он включает.

0 голосов
/ 26 марта 2012

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

Я думаю, вам нужно сначала создать представление, прежде чем вы сможете получить доступ к его элементам. См. здесь и здесь .

Пример из одного из моих проектов:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.leftlistfragment, container, false);
    return v;
}

EDIT

Возможно, проблема в том, как вы создаете фрагмент (я не знаком с методом, который вы используете с тегами). Может быть, это может сработать и для вас:

        titleFrag = new TitlesFragment();
        getFragmentManager().beginTransaction()
                .replace(R.id.TitlesContainer, titleFrag, SECOND_FRAGMENT_TAG).commit();
...