Android - Как передавать данные из активности в фрагмент?
Мне нужно передать данные из активности в фрагмент. Я знаю, что могу использовать пакет, но как только я передал данные, я не могу отправлять данные без вызова и создания фрагмента.
В моей деятельности некоторые вещи могут быть изменены, и мне нужно уведомить об этом фрагмент для этих изменений без повторного создания фрагмента.
Ответы
Ответ 1
Создайте один interface
в Activity
и передайте свои данные с помощью interface
в fragment
. Внесите это interface
в свой fragment
, чтобы получить данные.
Например
MainActivity.class
public class MainActivity extends AppCompatActivity {
DataFromActivityToFragment dataFromActivityToFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
FragmentA fr = new FragmentA();
FragmentManager fm = getFragmentManager();
dataFromActivityToFragment = (DataFromActivityToFragment) fr;
FragmentTransaction fragmentTransaction = fm.beginTransaction();
fragmentTransaction.replace(R.id.fragment_place, fr);
fragmentTransaction.commit();
final Handler handler = new Handler();
final Runnable r = new Runnable() {
public void run() {
dataFromActivityToFragment.sendData("Hi");
}
};
handler.postDelayed(r, 5000);
}
public interface DataFromActivityToFragment {
void sendData(String data);
}
}
FragmentA.class
public class FragmentA extends Fragment implements MainActivity.DataFromActivityToFragment {
TextView text;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.content_main, null);
text = (TextView) rootView.findViewById(R.id.fragment_text);
return rootView;
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
}
@Override
public void sendData(String data) {
if(data != null)
text.setText(data);
}
}
activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<LinearLayout
android:id="@+id/fragment_place"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
</LinearLayout>
</LinearLayout>
content_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/fragment_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
В приведенном выше примере я взял Runnable
только для отправки данных с задержкой в 5 секунд после создания fragment
.
Ответ 2
Объект фрагмента похож на другие объекты. Подобно String, вы можете вызывать методы строкового объекта, str.charAt(0), str.toUpperCase() и т.д. Просто создайте функцию в фрагменте, поместите там свой код и вызовите функция вместе со значениями
Inside Activity {
fragDemoObject.doWhatYouWant("this is passed as string object to fragment");
}
Inside FragmentDemo{
void doWhatYouWant(String input){
System.out.println(input);
// do what else you want to do with code
}
}
Ответ 3
Собственно, ваш вопрос не связан с:
Мне нужно передать данные из активности в fragmenet. Я знаю, что могу использовать пакет, но один я передал данные, я не могу больше отправлять данные без вызывая и создавая фрагмент еще раз.
Реальный:
в моей деятельности, некоторые вещи могут быть изменены, и мне нужно уведомить меня фрагмент из этих изменений без повторного создания фрагмента.
как я могу это сделать?
В этом случае я бы сохранил фрагмент в действии в качестве ссылки, и я бы назвал функцию, реализацию интерфейса внутри фрагмента.
Что-то вроде этого:
В действии:
SomeEventListener myFragment ;
yourFragmentCreationMethod(){
if(myFragment == null){
myFragment = new MyFragment(maybeParamsHere);
}
}
yourNotificationMethod(){
myFragment .onEventHappent(param);
}
// declare an interface: - separate file
public interface SomeEventListener
{
void onEventHappent(param);
}
// implement the interface in Fragment - separate file
public class MyFragment extends Fragment implements SomeEventListener{
// add a constructor what you like
public void onEventHappent(param){
/// ... your update
}
}
Интерфейс поможет вам только при тестировании.
Ответ 4
Активность хоста может доставлять сообщения фрагменту, захватывая Экземпляр фрагмента с помощью findFragmentById(), затем напрямую вызывайте фрагмент публичных методов.
В вашем фрагменте MyFragment
создайте общедоступный метод
public void myFragmentDataFromActivity(int passedDataFromActivity) {
// do your stuff
}
В вашей деятельности, чтобы передать целочисленное значение, скажите, 100:
получить экземпляр MyFragment с помощью getSupportFragmentManager или getFragmentManager, указав id/tag/position. Затем вызовите открытый метод в экземпляре MyFragment.
MyFragment myFragment = (MyFragment) getSupportFragmentManager.getFragmentById(id);
myFragment.myFragmentDataFromActivity(100);
Вы также можете использовать getFragmentByTag(tag)
, getFragments().get(position)
вместо getFragmentById(id)
для получения экземпляра фрагмента.
читайте больше об этом
Ответ 5
попробуйте это в Activity
fragment=new PdfFragment();
if (fragment != null) {
FragmentManager fragmentManager = getFragmentManager();
Bundle bundle = new Bundle();
bundle.putString("pdf", Pdf);
bundle.putString("flag", "0");
fragment.setArguments(bundle);
fragmentManager.beginTransaction().replace(R.id.container, fragment).addToBackStack(null).commit();
}
и во фрагменте
Pdf = getArguments().getString("pdf");
Ответ 6
Вы должны объявить свой метод как открытый в фрагменте для обновления новых данных. Затем вы вызовете этот метод через экземпляр фрагмента. Например, напишите это в своей деятельности при получении новых данных:
fragmentInstance.publicMethod(newData);
Счастливое кодирование!
Ответ 7
Для уведомления фрагмента с некоторыми данными после его создания можно выполнить с помощью какого-либо Communicator, или вы всегда можете передавать данные с помощью пакета во время создания...
Например:
public interface FragmentCommunicator {
void updateDataToFragment(List<Parcelable> data);
}
то в вашем фрагменте реализует этот интерфейс и вызывает его из действия, например: `
Fragment fragment = mSectionsPagerAdapter.getRegisteredFragment(i);
if (fragment instanceof FragmentCommunicator) {
FragmentCommunicator fragmentCommunicator = (FragmentCommunicator) fragment;
fragmentCommunicator.updateDataToFragment(data);
}`
Это должно работать для вашего случая...
Ответ 8
Я также сталкивался с той же проблемой, я использовал класс singleton для передавать данные из активности в фрагмент (без создания фрагмента транзакция или использование inteface)
class DataPersistance {
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPlace() {
return place;
}
public void setPlace(String place) {
this.place = place;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
private String name;
private String place;
private String type;
private static final DataPersistance ourInstance = new DataPersistance();
static DataPersistance getInstance() {
return ourInstance;
}
private DataPersistance() {
}
}
для установки и получения данных
DataPersistance.getInstance().setName(mEditText.getText().toString());
String name = DataPersistance.getInstance().getName();