Пакет совместимости Android Fragment как внутренний статический класс - PullRequest
5 голосов
/ 07 сентября 2011

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

android.support.v4.app.Fragment$InstantiationException: Unable to instantiate fragment org.wr.CreditCardHolderActivity.CreditCardHolderFragment: make sure class name exists, is public, and has an empty constructor that is public

А когда я разделяю фрагмент и действие, все работает гладко, кто-нибудь знает почему? и как я могу это исправить?

Спасибо!

1 Ответ

7 голосов
/ 22 декабря 2011

Если у вас есть внутренний класс Fragment, такой как:

public class SomethingFragment extends Fragment {    
  public static final class TypeFragment extends BaseFragment
  {

    public static Fragment newInstance()
    {
        return new TypeFragment();
    }

    private View mRootView;
    private ListView mListView;

    /**
     * @see android.support.v4.app.Fragment#onCreateView(android.view.LayoutInflater,
     *      android.view.ViewGroup, android.os.Bundle)
     */
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState)
    {
        mRootView = inflater.inflate(R.layout.fragment_category_list, container, false);
        mListView = (ListView) mRootView.findViewById(R.id.fragment_listview);
        return mRootView;
    }
  }
}

Убедитесь, что ваш квалификатор public , когда FragmentActivity пытается повторно инициализировать фрагмент, который он не вызывает из конкретногокласс, он будет обрабатывать его из абстрактного FragmentActivity, и если ваш внутренний класс Fragment является закрытым, у Activity нет ссылок на onSaveState, onRestoreState, initialize и т. д.

Обновление:

Посмотрите на https://android.googlesource.com/platform/frameworks/support/+/refs/heads/master/v4/java/android/support/v4/app/Fragment.java

Метод instantiate вызывает newInstance() при попытке восстановить Fragmentиз сохраненного состояния (где фрагмент был полностью уничтожен).

Метод newInstance требует, чтобы класс был общедоступным, поэтому, когда он определен как внутренний класс, это означает, что он должен быть public и static, где это необходимо.

Надеюсь, что этопроясняет некоторые будущие вопросы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...