Отправить строку из действия во фрагмент

Я пытаюсь передать строку из действия во фрагмент. Как видите, я использую оператор if, чтобы предотвратить сбой приложения. В сообщении Toast всегда отображается «Bundle null». Как я могу предотвратить бунде от нуля?

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

public class SettingsActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    getSupportFragmentManager().beginTransaction()
            .replace(android.R.id.content, new SetttingsFragment())
            .commit();


    Bundle bundle = new Bundle();
    bundleSettings.putString("my_bundle_key", "Bundle");     
    SetttingsFragment setttingsFragment = new SetttingsFragment();
    setttingsFragment.setArguments(bundle);

Фрагмент:

public class SetttingsFragment extends PreferenceFragmentCompat  {
@Override
public void onCreatePreferences(Bundle bundle, String rootKey) {
    setPreferencesFromResource(R.xml.preferences, rootKey);

    Bundle bundle = getArguments();
    if (bundle != null){
        String bundleString = bundle.getString("my_bundle_key");
        Log.i("my_bundle_key", bundleString);           
    } else{
        Toast.makeText(getActivity(), "Bundle null", Toast.LENGTH_LONG).show();
    }

добавьте значение Bundle перед этой строкой getSupportFragmentManager().beginTransaction() .replace(android.R.id.content, new SettingsFragment()) .commit();

HussainAbbas 08.04.2019 11:50
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
1
111
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

From Activity you send data with intent as:

Bundle bundle = new Bundle();
bundle.putString("edttext", "From Activity");
Fragmentclass obj = new Fragmentclass();
obj .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);
}

В своей деятельности вы создаете два объекта фрагмента, второй объект, где вы делаете setargument, не привязан к представлению и не используется. Ваш фрагмент должен быть прикреплен к представлению следующим образом:

Bundle bundle = new Bundle();
bundleSettings.putString("my_bundle_key", "Bundle");     
SetttingsFragment setttingsFragment = new SetttingsFragment();
setttingsFragment.setArguments(bundle);

  getSupportFragmentManager().beginTransaction()
        .replace(android.R.id.content, setttingsFragment)
        .commit();

Вы должны вызвать Bundle перед вызовом fragment следующим образом:

Bundle bundle = new Bundle();
        bundleSettings.putString("my_bundle_key", "Bundle");     
        SetttingsFragment setttingsFragment = new SetttingsFragment();
        setttingsFragment.setArguments(bundle);

    getSupportFragmentManager().beginTransaction()
                .replace(android.R.id.content, setttingsFragment)
                .commit();
Ответ принят как подходящий

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

  1. создать пакет
  2. создать фрагмент
  3. установить пакет во фрагменте
  4. показать фрагмент

так вам нужно передать аргументы во фрагменте

public class SettingsActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    SettingsFragment settingsFragment = new SettingsFragment();
    if (savedInstanceState == null) {
        Bundle bundle = new Bundle();
        bundle.putString("my_bundle_key", "Bundle");     
        settingsFragment.setArguments(bundle);
    }
    else {
        settingsFragment.setArguments(savedInstanceState);
    }
    getSupportFragmentManager().beginTransaction()
        .replace(android.R.id.content, settingsFragment)
        .commit();

In Activity

AbcFragment fragment = AbcFragment .newInstance(**Value**);
               getSupportFragmentManager.beginTransaction()
                        .replace(R.id.layout_container, fragment)
                        .commit();

In Fragment

public static AbcFragment newInstance(String Value) {
        Bundle args = new Bundle();

        args.putString("Value", Value);

        AbcFragment fragment = new AbcFragment ();
        fragment.setArguments(args);
        return fragment;
    }

Вам нужно добавить его в качестве аргументов с фрагментами, а затем можно запустить транзакции фрагментов, чтобы запустить фрагмент. Ключ, используемый здесь, является «вводом», и вот пример -

   Bundle bundle = new Bundle();
   bundle.putString("input", "dummy string args");
   MapFragment mapFragment = new MapFragment();
   mapFragment.setArguments(bundle); 

и получайте аргументы, т.е. ввод внутри фрагмента, используйте его как -

String data =  getArguments().getString("input")

Другие вопросы по теме