невозможно передать данные из фрагмента в таблицу, используя безопасный Args в android jetpack - PullRequest
1 голос
/ 03 мая 2020

Я хочу передать данные из фрагмента в 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);
        }
    });


}

}

это мой tablayout

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 Ответ

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

tablayout - это фрагмент на вашем графике, поэтому он получает любые аргументы, которые вы ему передаете, а не ваши h1 и h2 фрагменты.

Есть несколько вещей вам нужно исправить:

  1. Вы используете неправильный 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();
    }
}
...