Не удалось создать экземпляр фрагмента
Невозможно создать экземпляр фрагмента, убедитесь, что имя класса существует, является общедоступным, и имеет пустой конструктор, который является общедоступным
Это потому, что мой Фрагмент не является статическим классом?
Это потому, что мой фрагмент является внутренним классом?
Если я сделаю свой фрагмент статическим классом, все мои ссылки на findViewById потерпят неудачу, что означает много рефакторинга.
Как я могу решить это, не превращая свой внутренний фрагмент в статический класс?
Ответы
Ответ 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);
должно быть полное имя класса