невозможно передать данные из фрагмента в таблицу с помощью безопасных аргументов в Android Jetpack
Я хочу передать данные из фрагмента в tablayout, но возвращающее нулевое значение. tablayout состоит из 2 фрагментов, как показано на рисунке, это мой tablayout
Я попытался передать данные из tablayout во фрагмент и его работу, но я не знаю, почему это не так. пожалуйста, помогите мне
это мой первый фрагмент
public class first_Frag extends Fragment {
NavController navController;
public first_Frag() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_first_, container, false);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
navController= Navigation.findNavController(view);
Button b=view.findViewById(R.id.btn);
b.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
first_FragDirections.ActionFirstFrag2ToTablayout action=first_FragDirections.actionFirstFrag2ToTablayout();
action.setName("yoo");
navController.navigate(action);
}
});
}
}
это мой макет
public class tablayout extends Fragment {
Toolbar toolbar;
TabLayout tabLayout;
ViewPager viewPager;
public tablayout() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_tablayout, container, false);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
final NavController navController = Navigation.findNavController(view);
//tablayoutDirections. action=tablayoutDirections.actionTablayout2ToB42();
// toolbar = view.findViewById(R.id.toolbar);
tabLayout = view.findViewById(R.id.tab_layout);
viewPager = view.findViewById(R.id.view_pager);
h1 f1=new h1();
h2 f2=new h2();
((AppCompatActivity) getActivity()).setSupportActionBar(toolbar);
tabLayout.setupWithViewPager(viewPager);
ViewPagerAdapter adapter = new ViewPagerAdapter(getActivity().getSupportFragmentManager(), 0);
adapter.addtabs(f1,"first");
adapter.addtabs(f2,"second");
viewPager.setAdapter(adapter);
}
private class ViewPagerAdapter extends FragmentPagerAdapter {
List<Fragment> fragments = new ArrayList<>();
List<String> titles = new ArrayList<>();
public ViewPagerAdapter(@NonNull FragmentManager fm, int behavior) {
super(fm, behavior);
}
public void addtabs(Fragment fragment, String title) {
fragments.add(fragment);
titles.add(title);
}
@NonNull
@Override
public Fragment getItem(int position) {
return fragments.get(position);
}
@Override
public int getCount() {
return fragments.size();
}
@Nullable
@Override
public CharSequence getPageTitle(int position) {
return titles.get(position);
}
}
} это фрагмент элемента tablayout (ПЕРВЫЙ), где мне нужно получить данные
public class h1 extends Fragment {
public h1() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_h1, container, false);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
final NavController navController= Navigation.findNavController(view);
if (getArguments()!=null)
{
tablayoutArgs args=tablayoutArgs.fromBundle(getArguments());
String name=args.getName();
Log.i("name",""+name);
}
else {
Toast.makeText(getContext(), "null", Toast.LENGTH_SHORT).show();
}
1 ответ
Решение
В tablayout
это Фрагмент на вашем графике, поэтому он получает любые аргументы, которые вы ему передаете, а не ваш h1
а также h2
фрагменты.
Вам необходимо исправить несколько вещей:
- Вы неправильно используете
FragmentManager
с твоимViewPagerAdapter
- вам следует использоватьgetChildFragmentManager()
правильно вложить вашViewPager
фрагменты внутри вашегоtablayout
Фрагмент. Это необходимо им для правильного сохранения и восстановления своего состояния при вращении:
ViewPagerAdapter adapter = new ViewPagerAdapter(getChildFragmentManager(), 0);
- Вы ожидаете аргументов по поводу
h1
а такжеh2
, но никогда не звониsetArguments()
на этих фрагментах. Здесь у вас есть два варианта: передать аргументы изtablayout
в каждый фрагмент ИЛИ получить аргументы родительского фрагмента (теперьh1
а такжеh2
теперь дочерние фрагменты):
// Set the arguments from the tablayout onto h1 and h2
h1 f1=new h1();
f1.setArguments(getArguments());
h2 f2=new h2();
f2.setArguments(getArguments());
// OR get the arguments from the parent fragment
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
Fragment parentFragment = getParentFragment();
Bundle parentArguments = parentFragment.getArguments();
if (parentArguments!=null)
{
tablayoutArgs args=tablayoutArgs.fromBundle(parentArguments);
String name=args.getName();
Log.i("name",""+name);
}
else {
Toast.makeText(getContext(), "null", Toast.LENGTH_SHORT).show();
}
}