При попытке создать фрагмент внутри DialogFragment приложение вылетает, а в стэктрэйсе такое описание проблемы:
java.lang.IllegalStateException: Fragment does not have a view
at android.support.v4.app.Fragment$2.onFindViewById(Fragment.java:2203)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1316)
at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1574)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1641)
at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:794)
at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2415)
at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2200)
at android.support.v4.app.FragmentManagerImpl.optimizeAndExecuteOps(FragmentManager.java:2153)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2063)
at android.support.v4.app.Fragment.performStart(Fragment.java:2261)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1369)
at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1574)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1641)
at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:794)
at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2415)
at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2200)
at android.support.v4.app.FragmentManagerImpl.optimizeAndExecuteOps(FragmentManager.java:2153)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2063)
at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:725)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
В самом DialogFragment такой код:
public class TestFragment extends DialogFragment {
static AppCompatActivity activity;
static TextView mMainWord;
static int rightAnswer;
static FragmentManager fragmentManager;
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
View v = LayoutInflater.from(getActivity())
.inflate(R.layout.fragment_test, null);
mMainWord = v.findViewById(R.id.guess_word);
mMainWord.setTextSize(45.f);
activity = (AppCompatActivity) getActivity();
fragmentManager = getChildFragmentManager();
updateQuestion();
return new AlertDialog.Builder(getActivity())
.setView(v)
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {}
})
.create();
}
public static void returnAnswer(int answer){
mMainWord.setBackgroundColor(answer == rightAnswer? Color.GREEN : Color.RED);
NextSubFragment fragment = NextSubFragment.newInstance();
fragmentManager.beginTransaction().replace(R.id.sub_container, fragment).commit();
}
public static void updateQuestion(){
CardLab mCardLab = CardLab.getCardLab(activity);
if (!(mCardLab.getLength() < 4)) {
List<Integer> indexes = newInt(new ArrayList<Integer>(), mCardLab.getLength());
for (int i = 0; i < 3; i++) {
newInt(indexes, mCardLab.getLength());
}
List<CardLab.Card> list = mCardLab.getItems();
String[] arr = new String[]{
list.get(indexes.get(0)).getName(),
list.get(indexes.get(1)).getName(),
list.get(indexes.get(2)).getName(),
list.get(indexes.get(3)).getName()};
Random r = new Random();
rightAnswer = r.nextInt(3);
String mainWord = list.get(r.nextInt(3)).getTranslate();
ChooseSubFragment subfragment = ChooseSubFragment.newInstance(arr);
Log.w("test", subfragment == null ? "null" : "not null");
fragmentManager.beginTransaction().replace(R.id.container ,subfragment ).commit();
mMainWord.setText(mainWord);
} else {
mMainWord.setTextSize(15.f);
mMainWord.setText(R.string.not_enouhg_cards_err);
}
}
private static List<Integer> newInt(List<Integer> list, int max){
Integer i;
Random r = new Random();
i = r.nextInt(max);
if (!list.contains(i)) {
list.add(i);
return list;
} else {
return newInt(list, max);
}
}
}
А так же код вызываемого фрагмента:
public class ChooseSubFragment extends Fragment{
static List<Button> chooseButtons;
static List<String> variants;
static List<View.OnClickListener> listeners;
public ChooseSubFragment() {
}
public static ChooseSubFragment newInstance(final String [] variantsArr) {
ChooseSubFragment fragment = new ChooseSubFragment();
variants = new ArrayList<>();
listeners = new ArrayList<>();
for (int i = 0; i < 4; i++) {
variants.add(variantsArr[i]);
final int j = i;
listeners.add(new View.OnClickListener() {
@Override
public void onClick(View view) {
TestFragment.returnAnswer(j);
}
});
}
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.subfragment_choose, container, false);
chooseButtons = new ArrayList<>();
Button button;
button = view.findViewById(R.id.choose_first);
chooseButtons.add(button);
button = view.findViewById(R.id.choose_second);
chooseButtons.add(button);
button = view.findViewById(R.id.choose_third);
chooseButtons.add(button);
button = view.findViewById(R.id.choose_fourth);
chooseButtons.add(button);
Log.w("test", chooseButtons.get(0) == null ? "null" : "not null");
for (int i = 0; i < chooseButtons.size(); i++) {
chooseButtons.get(i).setText(variants.get(i));
chooseButtons.get(i).setOnClickListener(listeners.get(i));
}
return view;
}
}
Подскажите, как решить проблему.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости