Android: Обходной путь для support.v4.app.Fragment -> Фрагмент classcastexception? - PullRequest
6 голосов
/ 29 января 2012

Я пытаюсь добавить support.v4.app.Fragment к заголовку PreferenceActivity, вот так:

<header
    android:fragment="com.example.SupportFragmentSubClass"
    android:title="Selecting this should show the accompanying fragment" >
</header>

Это вызывает исключение ClassCastException, предположительно, потому что PreferenceActivity ожидает подкласс android.app.Fragment, а не support.v4.app.Fragment.

Мой пример использования:
У меня есть нестандартный фрагмент, который я хочу использовать в качестве предпочтения на устройствах <3.0 и> 3.0. Для> = 3.0 мне нужен подкласс android.app.Fragment, чтобы его можно было встроить в «панель сведений» действия предпочтений на планшетных устройствах. Для <3.0 мне нужен подкласс <code>v4.support.app.Fragment, чтобы я мог добавить в него ActivityFragment.

Есть ли обходной путь, который позволил бы мне использовать Фрагмент совместимости в этой ситуации?

Ответы [ 2 ]

7 голосов
/ 29 января 2012

PreferenceFragment отсутствует в пакете поддержки Android, и вы не можете использовать класс Fragment пакета поддержки Android таким образом PreferenceActivity.Более того, ваши заголовки не будут работать на Android 2.x в любом случае, так как PreferenceActivity в Android 2.x не знает о фрагментах.

В принципе, вы могли бы разветвлять PreferenceActivity из исходного кодачтобы создать тот, который использует поддержку Android версии Fragment.

, или организуйте свои предпочтения, чтобы использовать фрагменты на Android 3.0+ и избегать их на Android 2.x. Вот пример проекта , где я демонстрирую способ сделать это.

2 голосов
/ 30 января 2012

Как указывает @CommonsWare, невозможно переписать PreferenceActivity на то, что я хотел, и это похоже на нагрузку.

Не слишком элегантное решение, на котором я остановился, состояло в том, чтобы создать две PreferenceActivities (, как показано здесь ), а также создать два подкласса Fragment, по одному для каждого варианта Fragment.

Итак, PrefsActivityHC добавляет этот заголовок:

<header
    <!-- An android.app.Fragment subclass -->
    android:fragment="com.example.project.MyFragmentHC"
</header>

... в то время как PrefsActivity добавляет это предпочтение:

<Preference>
    <intent
        <!-- A v4.support.app.Fragment subclass, wrapped in an ActivityFragment -->
        android:targetClass="com.example.project.MyFragmentActivity"
        android:targetPackage="com.example.project" >
    </intent>
</Preference>

Чтобы свести к минимуму объем дублирования кода, необходимого для двух почти идентичных фрагментов, я создал класс MyFragmentDelegate, который поддерживает общие методы фрагментов, и сохранил экземпляр этого в MyFragment и MyFragmentHC. Вызовы методов в этих фрагментах затем просто перенаправляются делегату:

class MyFragment {

    MyFragmentDelegate mDelegate;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return mDelegate.onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    }
}

class MyFragmentHC {

    MyFragmentDelegate mDelegate;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return mDelegate.onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...