Я пытаюсь передать строку из действия во фрагмент. Как видите, я использую оператор 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();
}
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();
В вашем коде вы устанавливаете пакет для переменной фрагмента, которую вы не используете
так вам нужно передать аргументы во фрагменте
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")
добавьте значение Bundle перед этой строкой getSupportFragmentManager().beginTransaction() .replace(android.R.id.content, new SettingsFragment()) .commit();