2017-02-13 11 views
0

Я создал интерфейс, поэтому я могу установить текст на FragmentB, когда я нажимаю TextView на FragmentA. Что-то не работает, и я не могу понять это.Создайте интерфейс для связи с другим фрагментом

Я создал интерфейс под названием Communicator:

public interface Communicator { 
void respond(String data); 

}

На Fragmenta я поставил ссылку на интерфейс под названием Communcator и OnClickListener на TextView:

Communicator comm; 

homeTextView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      comm.respond("Trying to set text on FragmentB from here"); 
     } 
    }); 

FragmentB, set мой метод для изменения текста:

public void setText(final String data) { 
    startTripTxt.setText(data); 
} 

Наконец в MainActivity я реализовал интерфейс .. Я думаю, что здесь, где я делаю что-то неправильно:

@Override 
public void respond(String data) { 

    getSupportFragmentManager().beginTransaction() 
      .replace(R.id.container_main, new FragmentB(), "fragment2").addToBackStack(null).commit(); 

    FragmentB fragmentB= (FragmentB) getSupportFragmentManager().findFragmentByTag("fragment2"); 
    if (fragmentB != null) { 
     fragmentB.setText(data); 
    } 


} 

Фрагмент 2 нагрузки, но текст пуст.

+0

хорошо. Я думаю, что проблема заключается в функции ответа в MainActivity. Когда вы вызываете 'commit()', он не запускался в потоке пользовательского интерфейса, для его завершения требуется время, а затем фрагмент, объявленный после этого, будет null. – TruongHieu

ответ

2

Фрагмент 2 загружается, но текст пуст.

Вы реализуете Communicator в порядке, но способ, которым вы вызываете FragmentB, и передавать данные не в порядке. Вот почему вы не можете получить текст от FragmentB. правильный путь для передачи данных в FragmentB должно быть так:

public static FragmentB createInstance(String data) { 
     FragmentB fragment = new FragmentB(); 
     Bundle bundle = new Bundle(); 
     bundle.putString("data", data); 
     fragment.setArguments(bundle); 
     return fragment; 
    } 

И вы можете получить данные из FragmentB по:

Bundle bundle = getArguments(); 
     if (bundle != null) { 
      String data = bundle.getString("data"); 
     } 
1

Похоже, после того, как вы заявляете fragmentB, вы смысл установить текст на этом фрагменте. Вместо этого вы вызываете trainFinderFragment.setText(). Это ваша проблема?

FragmentB fragmentB= (FragmentB) getSupportFragmentManager().findFragmentByTag("fragment2"); 
if (fragmentB != null) { 
    fragmentB.setText(data); 
} 
+0

Я отредактировал свой вопрос. FragmentB на самом деле называется TrainFinderFragment, но переименовал его в FragmentB, чтобы он стал понятнее для всех. – r3dm4n

+0

О, ладно. Да, учитывая ваше редактирование, вы должны взять совет RoShan выше. Передайте текст с помощью пучка. –

 Смежные вопросы

  • Нет связанных вопросов^_^