Я прочитал this руководство пользователя, а также я читаю this книга. developer.android.com говорит, что я должен осуществлять общение через активность. Но в книге говорится, что я могу использовать setTargetFragment() и вызвать onActivityResult() вручную для целевого фрагмента из другого фрагмента. Каждый подход работает, но что правильно? Что такое setTargetFrament() for, если я не могу использовать его для связи с другим фрагментом?Связь между двумя фрагментами - это правильный путь?
0
A
ответ
2
setTargetFrament() и getTargetFrament() могут использоваться в контексте одного фрагмента, который запускает другой фрагмент. Первый фрагмент может передать его себе в качестве ссылки на второй фрагмент:
MyFragment newFrag = new MyFragment();
newFrag.setTargetFragment(this, 0);
getFragmentManager().beginTransaction().replace(R.id.frag_one, newFrag).commit();
Теперь newFrag можно использовать для получения getTargetFrament()
методов oldFrag и доступа из oldFrag непосредственно.
Это не то, что рекомендовано для использования на обычной основе.
Рекоммендуемый способ связи между фрагментами должны быть сделан через родительские активности, как docs упоминание:
Often you will want one Fragment to communicate with another,
for example to change the content based on a user event.
All Fragment-to-Fragment communication is done through the associated Activity.
Two Fragments should never communicate directly.
Вот пример того, что:
макет для основной деятельности:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<FrameLayout
android:id="@+id/frag_one"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"/>
<FrameLayout
android:id="@+id/frag_two"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"/>
</LinearLayout>
активности:
public class MainActivity extends Activity
{
private MyFragment f1;
private MyFragment f2;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Bundle b1 = new Bundle();
b1.putString("name", "Fragment One");
f1 = MyFragment.createNew(b1);//we create a new fragment instance
f1.setOnReceiveListener(new MyFragment.ReceiveListener()//we create a new ReceiveListener and pass it to the fragment
{
@Override
public void recv(String str)
{
//f1 has sent data to the activity, the activity passes forward to f2
f2.send(str);
}
});
//we attach the fragment to the activity
getFragmentManager().beginTransaction().add(R.id.frag_one, f1, "frag_one").commit();
//we repeat the above process for the second fragment
Bundle b2 = new Bundle();
b2.putString("name", "Fragment Two");
f2 = MyFragment.createNew(b2);
f2.setOnReceiveListener(new MyFragment.ReceiveListener()
{
@Override
public void recv(String str)
{
f1.send(str);
}
});
getFragmentManager().beginTransaction().add(R.id.frag_two, f2, "frag_two").commit();
}
}
Компоновка фрагмент:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<Button
android:id="@+id/frag_btn"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:layout_alignParentTop="true"/>
<TextView
android:id="@+id/frag_txt"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:layout_below="@+id/frag_btn"
android:textSize="10sp"/>
</RelativeLayout>
Класс фрагмент:
public class MyFragment extends Fragment
{
private ReceiveListener recv_list;
private Button btn;
private TextView txt;
//static factory function that creates new fragments
public static MyFragment createNew(Bundle b)
{
MyFragment f = new MyFragment();
f.setArguments(b);
return f;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
return inflater.inflate(R.layout.fragment, container, false);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState)
{
super.onViewCreated(view, savedInstanceState);
btn = (Button) view.findViewById(R.id.frag_btn);
txt = (TextView) view.findViewById(R.id.frag_txt);
//we retrieve the passed arguments (in this case the name)
Bundle b = getArguments();
final String name = b.getString("name");
btn.setText(name);
btn.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
if(null != recv_list)
{
//now we pass the data to the parent activity
recv_list.recv(name + " says hello!");
}
}
});
}
//the activity passes data to the fragment using this method
public void send(String s)
{
txt.append(s + "\n");
}
//helper method that will set the listener
public void setOnReceiveListener(ReceiveListener l)
{
recv_list = l;
}
//the declaration of the listener
public interface ReceiveListener
{
public void recv(String str);
}
}
Смежные вопросы
- 1. Связь между двумя фрагментами
- 2. Связь между двумя фрагментами (андроид)
- 3. Связь между фрагментами android
- 4. Связь между фрагментами xamarin
- 5. Связь между фрагментами
- 6. Связь между фрагментами Android
- 7. Связь между фрагментами в ViewPager
- 8. Обмен данными между двумя фрагментами?
- 9. Перетаскивание между двумя фрагментами
- 10. Перетаскивание между двумя фрагментами
- 11. динамическая связь между фрагментами Fail
- 12. перетаскивание между двумя фрагментами?
- 13. Переключение между двумя фрагментами
- 14. Навигация между двумя фрагментами
- 15. Слайд между двумя фрагментами
- 16. onItemClickListener между двумя фрагментами
- 17. Связь между фрагментами в android
- 18. Связь между фрагментами в ViewPager
- 19. Связь между фрагментами и ListFragment
- 20. Невозможно понять связь между фрагментами?
- 21. Связь EventBus между двумя фрагментами. Нет ошибки подписчика
- 22. Связь между двумя фрагментами, каждая в своей деятельности
- 23. Связь между двумя фрагментами из разных видов деятельности?
- 24. Связь между фрагментами без использования интерфейса
- 25. Добавление слушателя между двумя фрагментами
- 26. Разница между двумя фрагментами кода?
- 27. Связь между фрагментами/диалогами в android
- 28. Передача данных между двумя фрагментами
- 29. отправить Arraylist между двумя фрагментами
- 30. Удалить фрагменты между двумя фрагментами