Запуск фрагмента из фрагмента приводит к отображению экрана по умолчанию - PullRequest
0 голосов
/ 17 июня 2019

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

Не уверен на 100%, что делать в данный момент. Я

  1. Удостоверился, что .OnFragmentInteractionListener был реализован в моей основной деятельности для фрагмента

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

  3. Никаких ошибок не возникает

Обновление: Попытка реализовать интерфейс для связи с фрагментомот деятельности.Реализован интерфейс для активности, но мне нужен метод fragOut (), вызываемый, когда OnClick запускается из фрагмента.Не уверен, что делать, что раньше не работало с интерфейсами.

Обновление 2: Сделан интерфейс и я пытаюсь заставить его запустить мой метод, который запускает другой фрагмент.Тем не менее, я получаю эту ошибку при попытке вызвать метод

Update3: сделал интерфейс здесь Использование интерфейса для связи от фрагмента к активности и вытолкнул все необходимое для создания фрагмента внутри вызова метода интерфейсав действии.

FATAL 
    java.lang.NullPointerException: Attempt to invoke interface method
  'void   rangers.socman.BattleRhythmFrag$doubleFrag.fragOut()' on a null
   object reference
    at rangers.socman.BattleRhythmFrag.onClick(BattleRhythmFrag.java:149)

OnClick () от кнопок хостинга фрагмента

@Override
public void onClick(View v) {



    switch(v.getId()){



        case R.id.newBattle:
        {
          doubleFrag testFrag;     
          testFrag.fragOut();
           }

        case R.id.editBattle:
        {
            EditBattleFrag editBattleF = new EditBattleFrag();
            getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.home_content,editBattleF,editBattleF.getTag()).addToBackStack(null).commit();

        }

        case R.id.deleteBattle:
        {
            DeleteBattleFrag deleteBattleF = new DeleteBattleFrag();
            getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.home_content,deleteBattleF,deleteBattleF.getTag()).addToBackStack(null).commit();

        }

        break;
        default:
        {

        }
    }
}

Интерфейс, созданный на кнопках хостинга фрагмента

   public interface doubleFrag {
         void fragOut(Context context);
   }

Интерфейс, реализованный на основном занятии

    @Override
public void fragOut() {

    NewBattleFrag test = new NewBattleFrag();

    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

    transaction.replace(R.id.home_content,test);
    transaction.addToBackStack(null);

    transaction.commit();

}

1 Ответ

1 голос
/ 17 июня 2019

Я знаю, что это может означать много работы, но вы можете изменить свою реализацию. Из того, что я вижу, вы пытаетесь изменить фрагмент внутри фрагмента. Если вы спросите меня, задача Host Activity - изменить фрагменты (если вы не используете mvp или mvvm).

Это может быть легко достигнуто с помощью интерфейса. Создайте интерфейс внутри своего фрагмента следующим образом:

public interface myInterface {
    void myMethod();
}

Когда вы создаете экземпляр своего фрагмента в своей активности (ваша деятельность должна реализовывать ваш интерфейс), передайте «this» в качестве ссылки, чтобы фермент знал, что интерфейс должен связаться с Activity, когда об этом попросят. Таким образом, вы можете позволить Host Activity управлять своим собственным процессом для изменения фрагментов

// Create new fragment and transaction
Fragment newFragment = new ExampleFragment();
FragmentTransaction transaction = getFragmentManager().beginTransaction();

// Replace whatever is in the fragment_container view with this fragment,
// and add the transaction to the back stack
transaction.replace(R.id.fragment_container, newFragment);
transaction.addToBackStack(null);

// Commit the transaction
transaction.commit();

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

Удачи!

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