Android передает строку из фрагмента в фрагмент

#java #android #arrays #string #android-fragments

#java #Android #массивы #строка #android-фрагменты

Вопрос:

У меня есть два фрагмента ListNav и SwipeNav в панели навигации. ListNav показывает представление списка данных из массива String. SwipeNav отображает данные в виде прокрутки одних и тех же данных из массива string.

Я использую один фрагмент для просмотра нескольких вкладок с помощью салфетки viewpager.

Моя проблема в том :

 When I click on B in List View, it shows A in SwipeNav,
When I click on C in List View, it shows A in SwipeNav,
When I click on D in List View, it shows A in SwipeNav,
When I click on E in List View, it shows A in SwipeNav,
  

Я хочу получить результат:

 If I click on B in List View, it will show B in SwipeNav,
If I click on C in List View, it will show C in SwipeNav,
If I click on D in List View, it will show D in SwipeNav
  

Массив строк:

 <string-array name="tab_titles">
    <item>A</item>
    <item>B</item>
    <item>C</item>
    <item>D</item>
    <item>E</item>
    <item>F</item>
    <item>G</item>
    <item>H</item>
    <item>I</item>
    ........
</string-array>
  

Я использую ListNav ниже, чтобы заменить SwipeNav на OnItemClickListener:

ListNav:

 public class ListNav extends Fragment {

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        //returning our layout file 
        //change R.layout.yourlayoutfilename for each of your fragments
        return inflater.inflate(R.layout.nav_lis_layout, container, false);

    }

 @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        FragmentManager fm=getFragmentManager();
        FragmentTransaction ft = fm.beginTransaction();
        ft.add(R.id.fragment12, new ListNavAdapter());
        ft.commit();
  

ListNavAdapter:

 public class ListNavAdapter extends ListFragment {

@Override
public View onCreateView(LayoutInflater inflater,
                         ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.nav_list_layout, container, false);
    return view;
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    ArrayAdapter adapter = ArrayAdapter.createFromResource(getActivity(),
            R.array.tab_titles, android.R.layout.simple_list_item_1);
    setListAdapter(adapter);
    getListView().setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {

            String[] tabTitlesArray = getContext().getResources().getStringArray(R.array.tab_titles);
            Bundle bundle = new Bundle();
            bundle.putString("tab_titles", tabTitlesArray[i].toString());

            SwipeNav fragobj = new SwipeNav();
            fragobj.setArguments(bundle);

            FragmentManager fm=getFragmentManager();
            FragmentTransaction ft = fm.beginTransaction();
            ft.replace(((ViewGroup)(getView().getParent())).getId(), fragobj);
            ft.addToBackStack(null);
            ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
            ft.commit();
        }
    });
}
  

In SwipeNav:

 public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

    if (getArguments() != null amp;amp; !getArguments().isEmpty()) {
        Bundle bundle = this.getArguments();
        String myInt = bundle.getString("tab_titles");
    }
        return inflater.inflate(R.layout.nav_swipe, container, false);

}


@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    myPagerAdapter = new MyPagerAdapter(getChildFragmentManager(),getContext());
    viewPager = (ViewPager) view.findViewById(R.id.pager);

    viewPager.setAdapter(myPagerAdapter);

}
  

This is MyPagerAdapter:

 public class MyPagerAdapter extends FragmentStatePagerAdapter {
private Context context;


private String[] tabTitlesArray = null;
public MyPagerAdapter(FragmentManager fm, Context context) {
    super(fm);

    tabTitlesArray = context.getResources().getStringArray(R.array.tab_titles);
    this.context= context;
}

@Override
public Fragment getItem(int i) {
    Fragment fragment = new AFragment();
    Bundle args = new Bundle();

    args.putString(AFragment.ARG_OBJECT, tabTitlesArray[i]);
    fragment.setArguments(args);
    return fragment;
}

@Override
public int getCount() {
    return tabTitlesArray.length;
}

@Override
public CharSequence getPageTitle(int position) {


    return "OBJECT "   (position   1);
}
}
  

Отдельный фрагмент для расширения действия с вкладками:

 public class AFragment extends Fragment {
public static final String ARG_OBJECT = "object";

public AFragment() {
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    // The last two arguments ensure LayoutParams are inflated
    // properly.


    View rootView = inflater.inflate(R.layout.fragment_a, container, false);
    Bundle args = getArguments();
    ((TextView) rootView.findViewById(R.id.text1)).setText(args.getString(ARG_OBJECT));
    return rootView;


}
  

nav_lis_layout:

 <?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@ id/fragment12"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
  

nav_list_layout:

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <ListView
        android:id="@android:id/list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >
    </ListView>
</LinearLayout>
  

Я искал все ответы в Stackoverflow. Но не может решить мою проблему, почему щелчок по определенному элементу не отображает тот же элемент в следующем фрагменте.
Мне нужна ваша помощь, пожалуйста.

Комментарии:

1. Насколько я понимаю — у вас есть ViewPager с двумя (2) фрагментами. И вы должны передавать данные между фрагментами? Нажмите на first fragment показать second fragment с правильными данными?

2. Можете ли вы куда-нибудь загрузить код? Там много кода, и его трудно понять без полного класса.

3. @Boken Я добавил фрагментацию одного фрагмента. Я использовал один фрагмент для нескольких вкладок.

Ответ №1:

вы не должны ставить в строке запятые

  "tabTitlesArray[i]"
  

попробуйте с

  "" tabTitlesArray[i]
  

Комментарии:

1. Спасибо за ваше предложение. Я изменился, но моя проблема остается прежней.

2. если вы используете affragment несколько раз, то получите ваши данные следующим образом: bundle.getString(«объект»);

3. Я попробовал ваше предложение, например: bundle.putString(«объект», «A»); и bundle.getString («объект»); но решения нет.

4. Я думаю, вы меня не поняли. Вы отправляете данные с помощью этого ключа: args.putString(фрагмент. ARG_OBJECT, tabTitlesArray[i]); поэтому я хочу, чтобы вы извлекли ее с помощью того же ключа: bundle.getString(«объект»);

5. Я использовал то же самое, но без результата. Я передаю данные из ListNavAdapter в SwipeNav. Это проблема? Я использовал bundle.putString(фрагмент. ARG_OBJECT, tabTitlesArray[i].toString()); и String myString = bundle.getString(фрагмент. ARG_OBJECT);

Ответ №2:

Когда я нажимаю на B в представлении списка, он показывает A в SwipeNav,

Проблема в том, что вы отправляете один и тот же объект, но с разными ключами.

Что вам нужно сделать, так это onClick получить позицию вашего адаптера и поместить ее в свой bundle

 bundle.putString("tab_titles", tabTitlesArray[i].toString());
  

Затем вы получаете значение, используя String myString = bundle.getString("tab_titles");

И затем, когда вы создаете адаптер, вы можете отправить String параметр via и поместить текст в свой адаптер, в любом случае код будет беспорядочным… Это очень сложно понять.

Комментарии:

1. Спасибо за вашу поддержку. Я отредактировал и добавил все классы в вопросе. Я добавил ваш код, но та же проблема сохраняется.

2. @achalnaskar ПОЖАЛУЙСТА, ВСЕГДА используйте ОДИН И ТОТ ЖЕ КЛЮЧ, что это: args.putString(AFragment.ARG_OBJECT, tabTitlesArray[i]); послушайте меня, пожалуйста, если вы хотите получить данные, используйте один и тот же ключ, откуда вы отправляете и откуда вы получаете! Я имею в виду, что если вы делаете putString(Key1, значение), не используйте в своем get getString(key777777, значение), это не имеет смысла, ок? Проверьте это.

3. Спасибо, сэр, за ваше предложение. Я должен реализовать ваше предложение. До сих пор проблема остается той же. никаких улучшений. Я нажимаю на ListNav и открывает Swipenav. Но передача строки происходит из ListNavAdapter. Это проблема?

4. Я рекомендую вам поместить этот код в github и опубликовать в вашем вопросе, чтобы я мог взглянуть глубже

5. Я загрузил все по этой ссылке, пожалуйста, проверьте. github.com/achalnaskar/Navigation-with-swipe-views

Ответ №3:

В вашем SwipeNav после настройки ViewPager вы не использовали ViewPager.setCurrentItem() для перехода на нужную страницу. Поскольку setCurrentItem() нуждается в целочисленном аргументе, поэтому выбранная позиция в списке должна передаваться из ListNavAdapter в SwipeNav.

ListNavAdapter.java:

 public class ListNavAdapter extends ListFragment {

@Override
public View onCreateView(LayoutInflater inflater,
                         ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.nav_list_layout, container, false);
    return view;
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    ArrayAdapter adapter = ArrayAdapter.createFromResource(getActivity(),
            R.array.tab_titles, android.R.layout.simple_list_item_1);
    setListAdapter(adapter);
    getListView().setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
            //Toast.makeText(getActivity(), "Item: "   (i  1), Toast.LENGTH_SHORT).show();
            String[] tabTitlesArray = getContext().getResources().getStringArray(R.array.tab_titles);
            Bundle bundle = new Bundle();
            bundle.putString("tab_titles", tabTitlesArray[i].toString());

            bundle.putInt("tab_int", i);    //Added

            // set Fragmentclass Arguments
            SwipeNav fragobj = new SwipeNav();
            fragobj.setArguments(bundle);

            FragmentManager fm=getFragmentManager();
            FragmentTransaction ft = fm.beginTransaction();
            ft.replace(((ViewGroup)(getView().getParent())).getId(), fragobj);
            ft.addToBackStack(null);
            ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
            ft.commit();

            //Fragment f=getFragmentManager().findFragmentById(R.id.fragment12);
           // if(f==null){
               // getFragmentManager().beginTransaction().replace(((ViewGroup)(getView().getParent())).getId(), new SwipeNav()).commit();
           // }

        }
    });
}





  // Toast.makeText(getActivity(), "Item: "   (position  1), Toast.LENGTH_SHORT).show();
    // Create new fragment and transaction



}
  

SwipeNav.java:

 public class SwipeNav extends Fragment {

private MyPagerAdapter myPagerAdapter;
private ViewPager viewPager;

private int tab_int;    //Added


@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    //returning our layout file 
    //change R.layout.yourlayoutfilename for each of your fragments
    //String passingString = getArguments().getString("TAG");
    if (getArguments() != null amp;amp; !getArguments().isEmpty()) {
        Bundle bundle = this.getArguments();
        String myInt = bundle.getString("tab_titles");

        tab_int = bundle.getInt("tab_int"); //Added

        return inflater.inflate(R.layout.nav_swipe, container, false);
    } else {
        return inflater.inflate(R.layout.nav_swipe, container, false);
    }
}


@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    myPagerAdapter = new MyPagerAdapter(getChildFragmentManager(),getContext());
    viewPager = (ViewPager) view.findViewById(R.id.pager);
    //viewPager.setId( R.id.pager );
    viewPager.setAdapter(myPagerAdapter);

    viewPager.setCurrentItem(tab_int);  //Added

    //you can set the title for your toolbar here for different fragments different titles
    getActivity().setTitle("Satyanusaran Bengali");
}

}
  

Надеюсь, это поможет!