Я получил сообщение об ошибке «addView (View) не поддерживается в AdapterView» при использовании фрагмента - PullRequest
0 голосов
/ 06 марта 2012

Это не та же ситуация с Ошибка Logcat: «addView (View, LayoutParams) не поддерживается в AdapterView» в ListView

Я запускаю фрагмент в ActivityA:

FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.frag_a, new FragmentA());
ft.commit();

В макете FragmentA есть ListView, при щелчке элемента ListView он заменяет R.id.frag_a другим фрагментом, код которого выглядит следующим образом:

FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.frag_a, new FragmentB);
ft.commit();

И метод onCreateView FragmentA:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    super.onCreateView(inflater, container, savedInstanceState);
    View tview = inflater.inflate(R.layout.frag_list_a, container, false);

    mListView = (ListView) tView.findViewById(R.id.listview1);

    return tview;
}

OnCreateView FragmentB:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    super.onCreateView(inflater, container, savedInstanceState);
    if (container != null) {
            System.out.println("+++ container: " + container.getClass().getName());
    }
    View view = inflater.inflate(R.layout.frag_content_a, null, false);

    System.out.println("+++ view: " + view.getClass().getName());

    return view;
}    

проблема в том, что когда я щелкаю элемент в ListView FragmentA, выдается исключение:

ERROR/AndroidRuntime(321): java.lang.UnsupportedOperationException: addView(View) is not supported in AdapterView
    at android.widget.AdapterView.addView(AdapterView.java:435)
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:848)
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1041)
    at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:616)
    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1359)
    at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:411)
    at android.os.Handler.handleCallback(Handler.java:587)
    at android.os.Handler.dispatchMessage(Handler.java:92)
    at android.os.Looper.loop(Looper.java:123)
    at android.app.ActivityThread.main(ActivityThread.java:4627)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:521)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
    at dalvik.system.NativeStart.main(Native Method)

Я проверил реализацию FragmentManagerImpl, когда Fragment создается с помощью кода (не из макета), он добавляет представление фрагмента в mContainer:

if (!f.mFromLayout) {
    ViewGroup container = null;
    if (f.mContainerId != 0) {
        container = (ViewGroup)mActivity.findViewById(f.mContainerId);
        if (container == null && !f.mRestored) {
            throw new IllegalArgumentException("No view found for id 0x"
                    + Integer.toHexString(f.mContainerId)
                    + " for fragment " + f);
        }
    }
    f.mContainer = container;
    f.mView = f.onCreateView(f.getLayoutInflater(f.mSavedFragmentState),
            container, f.mSavedFragmentState);
    if (f.mView != null) {
        f.mView.setSaveFromParentEnabled(false);
        if (container != null) {
            Animator anim = loadAnimator(f, transit, true,
                    transitionStyle);   
            if (anim != null) { 
                anim.setTarget(f.mView);
                anim.start();       
            }
            container.addView(f.mView);
        }
        if (f.mHidden) f.mView.setVisibility(View.GONE);
        f.onViewCreated(f.mView, f.mSavedFragmentState);
    }
}

Я распечатываю контейнер в методе onCreateView FragmentB, это ListView в FragmentA. Поскольку ListView расширяет AdapterView, а AdapterView addView напрямую генерирует UnsupportedOperationException, именно поэтому возникает исключение.

Но я просто не знаю, как это исправить. Ценю вашу помощь.

Ответы [ 2 ]

1 голос
/ 20 июня 2013

Когда вы раздуваете макет в ArrayAdapter getView, установите для параметра parent значение null, как в View view = inflater.inflate(R.layout.mylayout, null);

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

FragmentA должен расширять ListFragment , и не переписывать метод onCreateView.
см. следующий код:

package org.goodev.fragment;

import android.os.Bundle;
import android.support.v4.app.ListFragment;
import android.widget.ArrayAdapter;
import android.widget.AdapterView.OnItemClickListener;

public class FragmentA extends ListFragment {

    private OnItemClickListener mOnItemClickListener;

    private static final String[] GENRES = new String[] {
        "Action", "Adventure", "Animation", "Children", "Comedy", "Documentary", "Drama",
        "Foreign", "History", "Independent", "Romance", "Sci-Fi", "Television", "Thriller"
    };

    private ArrayAdapter<String> mListAdapter;

    public FragmentA() {
        super();
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mListAdapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, GENRES);
    }

    @Override
    public void onStart() {
        super.onStart();
        setListAdapter(mListAdapter);
    }

    public void setOnItemClickListener(OnItemClickListener listener) {
        getListView().setOnItemClickListener(listener);
    }

}
...