Подтвердить что ты не робот

Не удалось создать экземпляр фрагмента

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

Это потому, что мой Фрагмент не является статическим классом? Это потому, что мой фрагмент является внутренним классом?

Если я сделаю свой фрагмент статическим классом, все мои ссылки на findViewById потерпят неудачу, что означает много рефакторинга.

Как я могу решить это, не превращая свой внутренний фрагмент в статический класс?

4b9b3361

Ответ 1

Как сообщает CommonsWare, сделайте его статическим или автономным, кроме того, не знаете, зачем вам нужен рефакторинг для работы findViewById. Предложения:

Используя представление, завышенное в onCreateView,

inflatedView.findViewById(.....)

или вызов его в onActivityCreated(.....)

getActivity().findViewById(......)

Но даже если вам по-прежнему нужна загрузка рефакторинга, тогда это может быть так, как есть, конвертация приложения для использования фрагментов не бесплатна, только что закончив проект.

Ответ 2

это потому, что мой фрагмент является внутренним классом

Если ваш фрагмент является внутренним классом, он должен быть статическим внутренним классом. В идеале это автономный открытый Java-класс.

если я сделаю свой фрагмент статическим классом, все мои ссылки на findViewById потерпят неудачу, что означает много рефакторинга

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

Как я могу решить это, не превращая свой внутренний фрагмент в статический класс?

Вы делаете это автономным общедоступным Java-классом.

Ответ 3

В вашем фрагменте не должно быть конструкторов (см. эту документацию и ее примеры).

У вас должен быть установлен статический метод newInstance() и передать любые параметры через аргументы (пакет)

Например:

public static final MyFragment newInstance(int title, String message)
{
    MyFragment fragment = new MyFragment();
    Bundle bundle = new Bundle(2);
    bundle.putInt(EXTRA_TITLE, title);
    bundle.putString(EXTRA_MESSAGE, message);
    fragment.setArguments(bundle);
    return fragment ;
}

И прочитайте эти аргументы в onCreate:

@Override
public Dialog onCreate(Bundle savedInstanceState)
{
    title = getArguments().getInt(EXTRA_TITLE);
    message = getArguments().getString(EXTRA_MESSAGE);

    //...
    //etc
    //...
}

Таким образом, если отсоединение и повторное присоединение, состояние объекта может храниться через аргументы, подобно связям, связанным с Intents.

Ответ 4

У меня тоже была эта проблема - оказалось, что это путано, потому что у моего пользовательского фрагмента был конструктор.

Я переименовал метод конструктора и вызвал новый метод вместо экземпляра, и он сработает!

Ответ 5

public static class MyDialogFragment extends DialogFragment {

    public MyDialogFragment(){

    }

    public Dialog onCreateDialog(Bundle savedInstanceState) {
            LinearLayout main = new LinearLayout(getActivity());
    main.setOrientation(LinearLayout.VERTICAL);


            return (new AlertDialog.Builder(getActivity()).setTitle(
    getText("Title")).setView(main).create());
            }
 }

Ответ 6

В моем случае у меня отсутствовал конструктор, сообщение от @eoghanm выше помогло мне

public static class MyDialogFragment extends DialogFragment {

    public MyDialogFragment(){
    }
...
}

Ответ 7

С помощью setRetainInstance (true) работало для нас. Теперь наши внутренние классы выглядят так:

public class SectionsPagerAdapter extends FragmentPagerAdapter {
    public SectionsPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
    // getItem is called to instantiate the fragment for the given page.
        Fragment fragment = new MySectionFragment();
        Bundle args = new Bundle();
        args.putInt(MySectionFragment.ARG_SECTION_NUMBER, position + 1);
        fragment.setArguments(args);
        fragment.setRetainInstance(true);
        return fragment;
    }
    // ...
}

public class MySectionFragment extends Fragment {
    public static final String ARG_SECTION_NUMBER = "section_number";
    @SuppressLint("ValidFragment")
    public MySectionFragment() {
    }
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        //...
    }       
    // ...
}

PS. Вот интересный вопрос о setRetainInstance (boolean): Понимание набора фрагментов FritmentRetainInstance (boolean)

Ответ 8

если вы не хотите сделать внутренний класс static, попробуйте переопределить метод onPause фрагмента диалога следующим образом:

public void onPause()
{
  super.onPause();
  dismiss();
}

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

Ответ 9

Убедитесь, что фрагмент не абстрактный. Скопируйте и вставьте такие вещи: (

Ответ 10

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

Ответ 11

Я встречаю эту проблему вам нужно использовать полное имя класса: например: Fragment.instantiate(MainActivity.this, com.XX.yourFragmentName);

должно быть полное имя класса