Инициализируйте и объявите Bundle в одной строке при отправке данных из одного фрагмента в другой - PullRequest
0 голосов
/ 03 мая 2020

Так что проблема не в технической проблеме, а скорее в эстетике c.

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

в первом фрагменте

Bundle bundle = new Bundle();
bundle.putBoolean("isFirst", true)
Fragment fragment = new ThirdFragment();
fragment.setArguments(bundle);
loadFragment(fragment);

и во втором фрагменте как

Bundle bundle = new Bundle();
bundle.putBoolean("isFirst", false)
Fragment fragment = new ThirdFragment();
fragment.setArguments(bundle);
loadFragment(fragment);

и в третьем фрагменте

Bundle bundle = this.getArguments();
Boolean isFirst = bundle.getBoolean("isFirst",false);
if(isFirst){
....
} else{
....
}

код работает нормально, но я думаю, что должно быть больше элегантный способ сделать это. Если не по крайней мере, сделайте все это в одну строку без дополнительных объявлений, таких как Bundle bundle и Fragmentgment

например что-то вроде

loadFragment(new ThirdFragment().setArguments(new Bundle().putBoolean("isFirst",true)));

Я относительно новичок в android и java программирование, поэтому, пожалуйста, не будь хар sh.

Ответы [ 2 ]

0 голосов
/ 03 мая 2020

вы можете создать newIstance() в ThirdFragment, как указано здесь

, вы также можете добиться того же с помощью кода ниже

public class Util {

static Fragment getThirdFragment(FragmentManager fragmentManager, Boolean isFirst, @NonNull ClassLoader classLoader, @NonNull String className) {
    Bundle bundle = new Bundle();
    bundle.putBoolean("isFirst", isFirst);
    Fragment fragment = fragmentManager.getFragmentFactory().instantiate(classLoader, className);
    fragment.setArguments(bundle);
    return fragment;
    }
}

и вызвать его

loadFragment(Util.getThirdFragment(getSupportFragmentManager(),true/*is first boolean value*/, ThirdFragment.class.getClassLoader(), ThirdFragment.class.getName()));

Kotlin

поместите этот код внутри ThirdFragment

companion object {
    @JvmStatic
    fun newInstance(param1: Boolean) =
            ThirdFragment().apply {
                arguments = Bundle().apply {
                    putBoolean("isFirst", param1)
                }
            }
}
0 голосов
/ 03 мая 2020

Я думаю, вы должны объявить stati c метод getInstance (Boolean isFirst) в примере ThirdFragment

public static ThirdFragment getInstance(Boolean isFirst) {
   Bundle bundle = new Bundle();
   bundle.putBoolean("isFirst", isFirst)
   Fragment fragment = new ThirdFragment();
   fragment.setArguments(bundle);
   return fragment
}

В вызовах First и SecondFragment

loadFragment(ThirdFragment.getInstance(true));
...