java.lang.IllegalStateException при создании фрагмента в DialogFragment

302
22 сентября 2017, 18:10

При попытке создать фрагмент внутри 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;
}

}

Подскажите, как решить проблему.

READ ALSO
Счетчик времени (Java)

Счетчик времени (Java)

Есть сервер, на нем некоторый класс, при создании объекта которого начинается отсчет времениОтсчет идет до тех пор пока существует объект

254
Consider defining a bean of type &#39;package&#39; in your configuration (Spring Boot)

Consider defining a bean of type 'package' in your configuration (Spring Boot)

После запуска приложение фейлитсяНе могу понять в чем ошибка

230
Graphics без метода

Graphics без метода

Можно ли в java проекте задействовать объект класса Graphics без использования специально созданного для этого метода?

230
Byte Buddy не работает

Byte Buddy не работает

Пробую пример из видео Rafael WinterhalterIdea выдает ошибку

180