Отправить данные для фрагмента с FragmentTransaction

Я нахожусь в своем классе фрагмента, вызывающего это:

@OnClick(R.id.blockedLinkLayout)
public void onBlockedClick(){
    final FragmentTransaction ft = getFragmentManager().beginTransaction();
    ft.replace(R.id.content, new SettingsBlockedUsersFragment(), FRAGMENT_TAG);
    ft.commit();
}

И он просто заменит мой текущий фрагмент выбранным.

И мой вопрос, как я могу отправить некоторые данные (например, String значение) из моего родительского фрагмента в мой дочерний фрагмент с помощью FragmentTransaction?

4 ответа

Решение

Просто передайте их в виде аргументов фрагмента

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

SettingsBlockedUsersFragment fragment = new SettingsBlockedUsersFragment();
Bundle arguments = new Bundle();
arguments.putString( string_key , desired_string);
fragment.setArguments(arguments);
final FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.content, fragment , FRAGMENT_TAG);
ft.commit();

в дочернем фрагменте:

Bundle arguments = getArguments();
String desired_string = arguments.getString(string_key);

FragmentTransaction это просто для перехода фрагментов, он ничего не "пропускает". Вам нужно использовать Bundle,

SettingsBlockedUsersFragment frag = new SettingsBlockedUsersFragment();
Bundle b = new Bundle();
// put stuff into bundle...
b.putString("user", "steve");

// Pass the bundle to the Fragment
frag.setArguments(b);

// Use Fragment Transaction
final FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.content, frag, FRAGMENT_TAG);
ft.commit();

Затем внутри OnCreate фрагмента, вы можете сделать

String user = getArguments().getString("user");

Другие способы передачи данных во фрагмент обсуждаются в разделе "Лучшие практики для создания нового фрагмента Android".

В вашем SettingsBlockedUsersFragment класс имеет статический метод, подобный следующему

public class SettingsBlockedUsersFragment extends Fragment {
    private static final String MY_STRING = "my_string";


    public static SettingsBlockedUsersFragment newInstance(String yourStringValue){
        SettingsBlockedUsersFragment frag = new SettingsBlockedUsersFragment();
        Bundle args = new Bundle();
        args.putString(MY_STRING, yourStringValue);
        frag.setArguments(args);
        return frag;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState){
          Bundle args = getArguments();
          if(args != null){
               String myString = args.getString(MY_STRING);
          }
    }
}

В вашей транзакции фрагмента вы можете передать аргументы следующим образом

final FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.content,SettingsBlockedUsersFragment.newInstance("my string"), FRAGMENT_TAG);
ft.commit();

Вы можете использовать фабричный метод в вашем классе фрагментов (как рекомендовано в документации)

public static YourFragment newInstance(String sample) {
    YourFragment fragment = new YourFragment();
    Bundle args = new Bundle();
    args.putString(KEY, sample);
    fragment.setArguments(args);
    return fragment;
}

затем вызовите YourFragment.newInstance("строка, которую нужно передать"); чтобы получить экземпляр вашего фрагмента и использовать его в своей транзакции.

Ключ здесь на самом деле использует метод setArguments() для передачи данных. Затем вы можете получить эти данные в методе oncreate вашего фрагмента, как это

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (getArguments() != null) {
        streamSource = getArguments().getParcelable(KEY);
    }
}
Другие вопросы по тегам