ListView не получает события нажатия - PullRequest
2 голосов
/ 08 марта 2012

Мой сценарий следующий:
- приложение использует панель действий, настроенную для отображения вкладок.
- одна вкладка отображает макет, содержащий несколько FrameLayouts, которые динамически заменяются фрагментами.Некоторые из них могут иметь ListViews.Приведенный здесь пример упрощен и содержит только один фрагмент, непосредственно добавленный в макет xml.
- при первом открытии вкладки все работает нормально
- переход на другую вкладку и обратно приводит к отображению ListView, разрешает прокрутку, но ненажмите события.

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

Важный код:
Слушатель вкладок из Dev Guide:

public static class TabListener<T extends Fragment> implements ActionBar.TabListener {
    private Fragment mFragment;
    private final Activity mActivity;
    private final String mTag;
    private final Class<T> mClass;

    public TabListener(Activity activity, String tag, Class<T> clz) {
        mActivity = activity;
        mTag = tag;
        mClass = clz;
    }

    public void onTabSelected(Tab tab, FragmentTransaction ft) {         
        if (mFragment == null) {               
            mFragment = Fragment.instantiate(mActivity, mClass.getName());
            ft.add(android.R.id.content, mFragment, mTag);
        } else {             
            ft.attach(mFragment);
        }
    }

    public void onTabUnselected(Tab tab, FragmentTransaction ft) {
        if (mFragment != null) {              
            ft.detach(mFragment);
        }
    }

    public void onTabReselected(Tab tab, FragmentTransaction ft) {           
    }
}


метод onCreateView изфрагмент, открытый с панели действий:

View view = null;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    if (view == null) {
        view = inflater.inflate(R.layout.tab, null);
    }
    return view;
}

Расположение вкладок, упрощенное здесь для отображения только фрагмента

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

    <fragment
        android:id="@+id/runModesListFragment"
        android:name="tab.fail.TabFragment"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >
    </fragment>

</LinearLayout>

И, наконец, список

public class TabFragment extends ListFragment {
    String[] listContent = {
        "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16",
        "17"
    };

    View view = null;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        if (view == null) {
            view = inflater.inflate(R.layout.tab_layout, null);
        }
        return view;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(),
                android.R.layout.simple_list_item_1, listContent);
        getListView().setAdapter(adapter);
    }
}

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

Любое предложение очень ценится:)

1 Ответ

1 голос
/ 13 марта 2012

Я реализовал обходной путь.Не очень хорошо и не объясняет, почему не работал только выбор в ListView, в то время как прокрутка и другие представления были хорошими, но это делает работу.Поскольку onCreateView и onActivityCreated в этом случае не вызывались, я заставил каркас сделать это, используя присоединение / отсоединение к фрагменту.Нет заметного снижения производительности, но я уверен, что существует лучшее решение.

Для справки, код:

    Fragment frag = getFragmentManager().findFragmentById(R.id.tabFragment);
    if (frag == null) {
        frag = new TabFragment();
        final FragmentTransaction ft = getFragmentManager().beginTransaction();
        ft.replace(R.id.tabFragment, frag);
        ft.commit();
    } else {
        final FragmentTransaction ft = getFragmentManager().beginTransaction();
        ft.detach(frag);
        ft.attach(frag);
        ft.commit();
    }

Я отмечу это как принятый, потому что не было никакой другой отправленной идеи.

...