#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");
}
}
Надеюсь, это поможет!