Отправка данных из активности во фрагмент в Android

У меня есть два класса. Первый - активность, второй - фрагмент, где у меня есть некий EditText. В activity у меня есть подкласс с async-задачей и в методе doInBackground я получаю некоторый результат, который сохраняю в переменную. Как я могу передать эту переменную из подкласса "моя активность" в этот фрагмент?

Решение

Из Activity вы отправляете данные с намерением как:

Bundle bundle = new Bundle();
bundle.putString("edttext", "From Activity");
// set Fragmentclass Arguments
Fragmentclass fragobj = new Fragmentclass();
fragobj.setArguments(bundle);

и в методе Fragment onCreateView:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    String strtext = getArguments().getString("edttext");    
    return inflater.inflate(R.layout.fragment, container, false);
}
Комментарии (30)

Также вы можете получить доступ к данных о деятельности из фрагмента:

Деятельность:

public class MyActivity extends Activity {

    private String myString = "hello";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my);
        ...
    }

    public String getMyData() {
        return myString;
    }
}

Отрывок:

public class MyFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        MyActivity activity = (MyActivity) getActivity();
        String myDataFromActivity = activity.getMyData();
        return view;
    }
}
Комментарии (4)

Я´нашел много ответов здесь @ stackoverflow.com, но определенно это правильный ответ:

"Отправка данных из активности во фрагмент в android".

Activity:

        Bundle bundle = new Bundle();
        String myMessage = "Stackoverflow is cool!";
        bundle.putString("message", myMessage );
        FragmentClass fragInfo = new FragmentClass();
        fragInfo.setArguments(bundle);
        transaction.replace(R.id.fragment_single, fragInfo);
        transaction.commit();

Фрагмент:

Чтение значения во фрагменте

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        Bundle bundle = this.getArguments();
        String myValue = bundle.getString("message");
        ...
        ...
        ...
        }

или просто

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        String myValue = this.getArguments().getString("message");
        ...
        ...
        ...
        }
Комментарии (3)

Этот ответ может быть слишком поздно. но это будет полезно для будущих читателей.

У меня есть некоторые критерии. Я закодировался на Выбрать файл с умыслом. и выбранный файл будет передан определенный фрагмент для дальнейшей обработки. у меня есть много фрагментов, имеющих возможности выбрать файл. в то время , каждый раз проверяя состояние и получить фрагмент и передать значение довольно противно. Итак , я решил передать значение через интерфейс.

Шаг 1: создать интерфейс по основной деятельности.

   public interface SelectedBundle {
    void onBundleSelect(Bundle bundle);
   }

Шаг 2: Создать ссылку SelectedBundle на одной и той же деятельности

   SelectedBundle selectedBundle;

Шаг 3: создать метод в одном действии

   public void setOnBundleSelected(SelectedBundle selectedBundle) {
       this.selectedBundle = selectedBundle;
   }

Шаг 4: нужно инициализировать ссылку SelectedBundle все фрагмент нужна функция выбора файлов.Вы поместите этот код на свой onCreateView фрагмента `(..) метод

    ((MainActivity)getActivity()).setOnBundleSelected(new MainActivity.SelectedBundle() {
          @Override
         public void onBundleSelect(Bundle bundle) {
            updateList(bundle);
        }
     });

Шаг 5: метод onActivityResult от основной активности, передать значения фрагментов, используя интерфейс.

 @Override
 protected void onActivityResult(int requestCode, int resultCode, Intent  data) {
       selectedBundle.onBundleSelect(bundle);
  }

Вот и все. Реализовать каждый фрагмент вы нужны на FragmentClass. Вы великие. вы сделали. Вау...

Комментарии (0)

Основная идея использования фрагментов (Ф) является создание многоразового самообеспечивающееся компоненты пользовательского интерфейса в приложениях для Android. Эти фрагменты содержатся в деятельности и существуют общие(лучший) способ создания канала связи стороны от A -> F и F-A, он является обязательным, чтобы общаться между ф-ф через деятельность, потому что тогда только фрагменты стать изолированным и самодостаточным.

Поэтому для передачи данных от A -> е собирается быть таким же, как пояснил ρяσѕρєя К. В дополнение к этому ответ, после создания фрагментов внутри активности, мы можем также передать данные фрагменты вызова методов в осколки.

Например:

    ArticleFragment articleFrag = (ArticleFragment)
                    getSupportFragmentManager().findFragmentById(R.id.article_fragment);
    articleFrag.updateArticleView(position);
Комментарии (1)

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

например : если ваш фрагмент зовут MyFragment

так вы назовете свой фрагмент из деятельности такой :

getSupportFragmentManager().beginTransaction().add(R.id.container, MyFragment.newInstance("data1","data2"),"MyFragment").commit();

*ИД р..контейнер-это идентификатор моего так

так в MyFragment.метод newinstance("по-данные1-то", то"данные 2 и") Вы можете отправить данные на фрагмент и в фрагмент вы получаете эти данные в MyFragment метод newinstance(строка параметр1, параметр2 строку)

public static MyFragment newInstance(String param1, String param2) {
        MyFragment fragment = new MyFragment();
        Bundle args = new Bundle();
        args.putString(ARG_PARAM1, param1);
        args.putString(ARG_PARAM2, param2);
        fragment.setArguments(args);
        return fragment;
    }

а затем в метод метод фрагмент вы'll получить данные:

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            mParam1 = getArguments().getString(ARG_PARAM1);
            mParam2 = getArguments().getString(ARG_PARAM2);
        }
    }

так что теперь mParam1 у данных1 и mParam2 у данных2

теперь вы можете использовать этот mParam1 и mParam2 в свой фрагмент.

Комментарии (3)

Если вы передадите ссылку на (конкретный подкласс) фрагмента в асинхронную задачу, вы сможете получить доступ к фрагменту напрямую.

Некоторые способы передачи ссылки на фрагмент в асинхронную задачу:

  • Если ваша асинхронная задача является полноценным классом (class FooTask extends AsyncTask), то передайте ваш фрагмент в конструктор.
  • Если ваша асинхронная задача является внутренним классом, просто объявите конечную переменную Fragment в области видимости, в которой определена асинхронная задача, или как поле внешнего класса. Вы сможете получить к ней доступ из внутреннего класса.
Комментарии (1)

Я хотел бы добавить для новичков, что разница между 2 наиболее upvoted ответы здесь дается различное использование фрагмента.

Если вы используете фрагмент, в классе Java, где у вас есть данные, которые вы хотите передать, можно применить первый вариант ответа для передачи данных:

Bundle bundle = new Bundle();
bundle.putString("edttext", "From Activity");
Fragmentclass fragobj = new Fragmentclass();
fragobj.setArguments(bundle);

Однако, если вы, например, использовать код по умолчанию на Android Studio для фрагментов вкладками, этот код не будет работать.

Это не будет работать, даже если вы замените PlaceholderFragment по умолчанию с вашим FragmentClasses, и даже если исправить FragmentPagerAdapter к новой ситуации добавляет переключатель для getitem() и еще переключатель для getPageTitle() (как показано [здесь][1])

Предупреждение: клип вышеперечисленное код ошибки, который я объясню позже, но это полезно, чтобы увидеть, как вы идете от кода по умолчанию для редактирования код для нашитые фрагменты)! В остальном мой ответ имеет гораздо больше смысла, если вы считаете классов Java и XML файлов с этого клипа (представитель первого использования фрагментов вкладками начинающих сценарий).

Главная причина наиболее upvoted ответ от этой страницы не будет работать, разве что в том, что код по умолчанию для фрагментов с вкладками, фрагменты используются в другой класс java: FragmentPagerAdapter!

Итак, для того, чтобы отправить данные, вы уговорены для того чтобы создать пучок в MotherActivity и передать его в FragmentPagerAdapter, с помощью ответа нет.2.

Только что снова ошибся. (Наверное, вы могли бы сделать это, но это всего лишь осложнением, которые на самом деле не нужны).

Правильный/простой способ сделать это, я думаю, заключается в передаче данных непосредственно на фрагмент в вопрос, используя ответа нет.2. Да, будет жесткая связь между деятельностью и фрагмент, но, для фрагменты с вкладками, что вроде ожидается. Я бы даже рекомендуем Вам зарегистрироваться фрагменты вкладками внутри класса MotherActivity Ява (как подклассы, как они никогда не будут использоваться за пределами MotherActivity) - это легко, просто добавить в класс MotherActivity Java, как много частей, как вам нужно, как это:

 public static class Tab1 extends Fragment {

    public Tab1() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.your_layout_name_for_fragment_1, container, false);
        return rootView;
    }
}.

Так, для передачи данных из MotherActivity такой фрагмент вам потребуется создать частный строк/связки выше методе onCreate вашей деятельности Мама - который вы можете заполнить с данными, которые вы хотите передать на фрагменты и передать их с помощью метода, созданного после onCreate (здесь называется getMyData()).

public class MotherActivity extends Activity {

    private String out;
    private Bundle results;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_mother_activity);

       // for example get a value from the previous activity
        Intent intent = getIntent();
        out = intent.getExtras().getString("Key");

    }

    public Bundle getMyData() {
        Bundle hm = new Bundle();
        hm.putString("val1",out);
        return hm;
    }
}

А потом в классе фрагмента, вы используете getMyData:

public static class Tab1 extends Fragment {
        /**
         * The fragment argument representing the section number for this
         * fragment.
         */
        public Tab1() {
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.your_layout_name_for_fragment_1, container, false);
            TextView output = (TextView)rootView.findViewById(R.id.your_id_for_a_text_view_within_the_layout);

            MotherActivity activity = (MotherActivity)getActivity();

            Bundle results = activity.getMyData();
            String value1 = results.getString("val1");

            output.setText(value1);
            return rootView;
        }
    }

Если у вас есть запросы к базе данных я советую вам делать их в MotherActivity (и передавать их результаты в виде строк/чисел прикреплены к ключи внутри пакета, как показано выше), а внутри вкладки фрагменты, твоя речь станет более сложным (это становится getActivity() например, и так будет getActivity().так), но у вас есть также возможность делать так, как вы хотите.

Мой совет для новичков является концентрация внимания на небольшие шаги. Во-первых, получить ваше намерение открыть очень простой вкладками деятельности, без передачи каких-либо данных. Это работает? Она открывается вкладок вы ожидали? Если нет, то почему?

Начните с этого, и применяя такие решения, как те, что представлены в [клип][1], видим, что отсутствует. Для этого конкретного клипа, mainactivity.xml никогда не показывается. Что, несомненно, смутит вас. Но если вы обратите внимание, то увидите, что, например, контекст (инструменты:контекст) - это неправильно В фрагмент XML-файлов. Каждый фрагмент XML нужно указать правильный класс фрагмент (или подкласс, используя разделитель $).

Вы также увидите, что в основном активность Java-класса, вам нужно добавить tabLayout.setupWithViewPager(mViewPager) - сразу после линии TabLayout tabLayout = (TabLayout) команду findViewById(Р. ИД.вкладки); без этой строки, ваш взгляд на самом деле не связаны с XML-файлов на фрагменты, но он показывает только XML-файл основной деятельности.

В дополнение к линии в основной вид деятельности Java-классов, в основной XML-файл нужно изменить вкладки в зависимости от ситуации (например, добавить или удалить TabItems). Если у вас нет вкладки в основной XML-активность, то возможно вы не Выберите правильный тип активности, когда вы создали его в первую очередь (новое направление деятельности - деятельность вкладками).

Обратите внимание, что в последних 3 пунктах я говорю о видео! Поэтому, когда я говорю основной вид деятельности XML, является основной XML активность на видео, которое в вашей ситуации-это XML-файл MotherActivity.

Комментарии (0)

От активность вы посылаете данные с пакета:

Bundle bundle = new Bundle();
bundle.putString("data", "Data you want to send");

// Your fragment
MyFragment obj = new MyFragment();
obj.setArguments(bundle);

И в Фрагмент метод onCreateView получить данные:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
{
    String data = getArguments().getString("data");// data which sent from activity  
    return inflater.inflate(R.layout.myfragment, container, false);
}
Комментарии (0)

Очень старый пост, еще осмелюсь добавить небольшое пояснение, что бы было полезно для меня.<п> Технически вы можете непосредственно установить члены любого типа В фрагмент деятельности.<БР> Так почему пакет?<БР> Причина очень проста - пучок обеспечивает равномерное способ обработки:<БР> - создание/открытие фрагмента<БР> -- реконфигурация (поворот экрана) - просто добавьте начальная/обновленный пакет в outState в данные метода onsaveinstance()<БР> -- восстановление приложения после того, как сборка мусора в фоновом режиме (как и при реорганизации).<п> Вы можете (если вы любите эксперименты) создания обходного пути в простых ситуациях, но расслоение-подход просто не'т вижу разницы между одним фрагментом и одна тысяча на backstack - он остается простым и понятным. <БР>Что's, почему в ответ @Elenasys - это самое простое и универсальное решение.<БР> и что's, почему ответ, данный @Мартин и ловушки

Комментарии (0)

лучшим подходом для отправки данных из класс Activity фрагмент проходит через сеттер. Как <БР/>

FragmentClass fragmentClass = new FragmentClass();
fragmentClass.setMyList(mylist);
fragmentClass.setMyString(myString);
fragmentClass.setMyMap(myMap);

и получить эти сведения от класса.

Комментарии (6)

Иногда вы можете получать намерения в вашей деятельности и вам нужно передать информацию на ваш рабочий фрагмент. Даны ответы в порядке, если вам нужно, чтобы начать этот фрагмент, но если это's по-прежнему работает, setArguments () - это не очень полезно. Другая проблема возникает, если прошла информация будет причина для взаимодействия с пользовательским интерфейсом. В этом случае вы не можете назвать что-то вродеmyfragment.passdata в (), Потому что Android будет быстро говорит, что только поток, который создал вид могут взаимодействовать.

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

В ВЫ фрагмент'метод onCreate с ():

protected DataReceiver dataReceiver;
public static final String REC_DATA = "REC_DATA";

@Override
public void onCreate(Bundle savedInstanceState) {

    data Receiver = new DataReceiver();
    intentFilter = new IntentFilter(REC_DATA);

    getActivity().registerReceiver(dataReceiver, intentFilter);
}

private class DataReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

        int data= intent.getIntExtra("data", -1);

        // Do anything including interact with your UI
    }
}

В Вас активность:

// somewhere
Intent retIntent = new Intent(RE_DATA);
retIntent.putExtra("data", myData);
sendBroadcast(retIntent);
Комментарии (0)

Если активность должен сделать фрагмент выполнить действие после инициализации, самый простой способ сделать это, имея активность вызвать метод фрагмент экземпляр. В "фрагмент", добавьте метод:

public class DemoFragment extends Fragment {
  public void doSomething(String param) {
      // do something in fragment
  }
}

а потом в "деятельность", получите доступ к фрагмент используя фрагмент менеджером и вызвать метод метод:

public class MainActivity extends FragmentActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        DemoFragment fragmentDemo = (DemoFragment) 
            getSupportFragmentManager().findFragmentById(R.id.fragmentDemo);
        fragmentDemo.doSomething("some param");
    }
}

и тогда "деятельность" может напрямую общаться с "фрагмент", вызывая этот "метод".

Комментарии (1)

Умный испытанный способ передачи данных между фрагментами и активности является создание переменных,например:

class StorageUtil {
  public static ArrayList employees;
}

Тогда для передачи данных из фрагмент в активность, мы делаем это в метод onActivityCreated:

//a field created in the sending fragment
ArrayList employees;

@Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
         employees=new ArrayList();

       //java 7 and above syntax for arraylist else use employees=new ArrayList() for java 6 and below

     //Adding first employee
        Employee employee=new Employee("1","Andrew","Sam","1984-04-10","Male","Ghanaian");
        employees.add(employee);

      //Adding second employee
       Employee employee=new Employee("1","Akuah","Morrison","1984-02-04","Female","Ghanaian");
         employees.add(employee);

        StorageUtil.employees=employees;
    }

Теперь вы можете получить значение StorageUtil.человек отовсюду. Гудлак!

Комментарии (0)

Вы можете создать публичный статический метод В фрагмент где вы сможете получить статическую ссылку на этот фрагмент, а затем передавать данные в эту функцию и установить, что сведения для аргументации в один метод и получить данные через getArgument на метод onCreate фрагмента, и установить, что данные в локальных переменных.

Комментарии (0)

Используйте следующий интерфейс для связи между деятельностью и фрагмент

public interface BundleListener {
    void update(Bundle bundle);
    Bundle getBundle();
}

Или использовать после этого универсального прослушивателя для двусторонней связи через интерфейс

 /**
 * Created by Qamar4P on 10/11/2017.
 */
public interface GenericConnector {
    T getData();
    void updateData(E data);
    void connect(GenericConnector connector);
}

метод фрагмент показать

public static void show(AppCompatActivity activity) {
        CustomValueDialogFragment dialog = new CustomValueDialogFragment();
        dialog.connector = (GenericConnector) activity;
        dialog.show(activity.getSupportFragmentManager(),"CustomValueDialogFragment");
    }

вы можете отдать свой контекст GenericConnector в onAttach(контекст) слишком

в вашей деятельности

CustomValueDialogFragment.show(this);

в вашем фрагменте

...
@Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        connector.connect(new GenericConnector() {
            @Override
            public Object getData() {
                return null;
            }

            @Override
            public void updateData(Object data) {

            }

            @Override
            public void connect(GenericConnector connector) {

            }
        });
    }
...
    public static void show(AppCompatActivity activity, GenericConnector connector) {
            CustomValueDialogFragment dialog = new CustomValueDialogFragment();
            dialog.connector = connector;
            dialog.show(activity.getSupportFragmentManager(),"CustomValueDialogFragment");
        }

Примечание: никогда не использовать его, как в " Наша".метод toString().метод toString().метод toString(); способ.

Комментарии (0)

Мое решение-написать статический метод внутри фрагмента:

public TheFragment setData(TheData data) {
    TheFragment tf = new TheFragment();
    tf.data = data;
    return tf;
}

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

Комментарии (2)

Я столкнулся с аналогичной проблемой при использовании новейших компонентов навигационной архитектуры. Опробовал все вышеперечисленные код с передачей пакета от моего призвания деятельность в Фрагмент.

Лучшие решения, следуя последним тенденциям развития в Android, является использование модели представления (часть наземная, воздушная, морская).

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

Теперь, в onViewCreated() фрагмента, инициализировать тот же ViewModel и наблюдателей установки прислушиваться к ViewModel поля.

Здесь является полезным, углубленный учебник, если вам нужно.

https://medium.com/mindorks/how-to-communicate-between-fragments-and-activity-using-viewmodel-ca733233a51c

Комментарии (0)

просто наткнулся на этот вопрос, в то время как большинство методов будет работать. Я просто хочу добавить, что вы можете использовать событие автобусная Библиотека, особенно в случаях, когда компонент (активность или фрагмент) и не был создан, его польза для всех размеров Android проектов, и многие из них используют в случаях. Я лично использовал его в нескольких проектах у меня на PlayStore.

Комментарии (0)

В своей деятельности объявить статическую переменную

public static HashMap contactItems=new HashMap();

Затем в фрагмент же, как следуйте

ActivityName.contactItems.put(Number,contactsModal);
Комментарии (1)