У меня есть CreateActivity.java, содержащий адаптер viewpager, который инициирует два фрагмента - Fragment1.java и Fragment2.java. В Fragment1.java У меня есть настройка listFragment, когда пользователь щелкает элемент в этом списке, я хочу переключить представление на Fragment2.java и изменить содержимое внутри Fragment2.java (изображение). То, что я сделал до сих пор:Изменение изображения ImageView в зависимости от предыдущего фрагмента - Viewpager
В Fragment1.java установлено onClickListener для ListView:
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
mCallback.onArticleSelected(position);
((CreateActivity) getActivity()).mViewPager.setCurrentItem(1);
}
Затем перешел к основной деятельности (CreateActivity) с использованием интерфейса. Затем послал позицию щелкнул данные в Fragment2.java в виде пучка:
public void onArticleSelected(int position) {
Bundle args = new Bundle();
args.putInt(Fragment2.ARG_POSITION, position);
Fragment2 fragobj = new Fragment2();
fragobj.setArguments(args);
Log.w("listposition", "" + position);
}
Тогда вспомнил это значение в Fragment2.java путем переопределения метода setArguments:
@Override
public void setArguments(Bundle args) {
super.setArguments(args);
int pos = args.getInt(ARG_POSITION, position);
Log.w("myApp", "" + pos);
}
Как бы я теперь идти о настройке image Я хочу в соответствии с целым положением? Я пробовал редактировать изображение так, но получаю ошибку NPE (прилагается). Есть идеи?
@Override
public void setArguments(Bundle args) {
super.setArguments(args);
int pos = args.getInt(ARG_POSITION, position);
Log.w("myApp", "" + pos);
iv_ttx = (ImageView) getView().findViewById(R.id.iv_ttx);
if (pos == 0){
iv_ttx.setImageResource(R.drawable.img1);
} else if (pos == 1){
iv_ttx.setImageResource(R.drawable.img2);
}
}
LogCat:
09-03 00:32:57.053: E/AndroidRuntime(28832): FATAL EXCEPTION: main
09-03 00:32:57.053: E/AndroidRuntime(28832): java.lang.NullPointerException
09-03 00:32:57.053: E/AndroidRuntime(28832): at com.meme.hdmeme.Fragment2.setArguments(Fragment2.java:209)
09-03 00:32:57.053: E/AndroidRuntime(28832): at com.meme.hdmeme.CreateActivity.onArticleSelected(CreateActivity.java:44)
09-03 00:32:57.053: E/AndroidRuntime(28832): at com.meme.hdmeme.Fragment1.onListItemClick(Fragment1.java:65)
09-03 00:32:57.053: E/AndroidRuntime(28832): at android.support.v4.app.ListFragment$2.onItemClick(ListFragment.java:58)
09-03 00:32:57.053: E/AndroidRuntime(28832): at android.widget.AdapterView.performItemClick(AdapterView.java:298)
09-03 00:32:57.053: E/AndroidRuntime(28832): at android.widget.AbsListView.performItemClick(AbsListView.java:1102)
09-03 00:32:57.053: E/AndroidRuntime(28832): at android.widget.AbsListView$PerformClick.run(AbsListView.java:2751)
09-03 00:32:57.053: E/AndroidRuntime(28832): at android.widget.AbsListView$1.run(AbsListView.java:3425)
09-03 00:32:57.053: E/AndroidRuntime(28832): at android.os.Handler.handleCallback(Handler.java:725)
09-03 00:32:57.053: E/AndroidRuntime(28832): at android.os.Handler.dispatchMessage(Handler.java:92)
09-03 00:32:57.053: E/AndroidRuntime(28832): at android.os.Looper.loop(Looper.java:137)
09-03 00:32:57.053: E/AndroidRuntime(28832): at android.app.ActivityThread.main(ActivityThread.java:5195)
09-03 00:32:57.053: E/AndroidRuntime(28832): at java.lang.reflect.Method.invokeNative(Native Method)
09-03 00:32:57.053: E/AndroidRuntime(28832): at java.lang.reflect.Method.invoke(Method.java:511)
09-03 00:32:57.053: E/AndroidRuntime(28832): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)
09-03 00:32:57.053: E/AndroidRuntime(28832): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562)
09-03 00:32:57.053: E/AndroidRuntime(28832): at dalvik.system.NativeStart.main(Native Method)
P.S. линия 209 является:
iv_ttx = (ImageView) getView().findViewById(R.id.iv_ttx);
Это тоже не работает, проблема в том, что при размещении в onCreateView() или onActivityCreated() я получаю NPE. Это потому, что я пытаюсь вернуть целое число, которое не существует при создании фрагмента. Целое число создается только тогда, когда пользователь нажимает на элемент в списке. –
Зачем вам создавать фрагмент без этого целочисленного значения? Я понимаю, что вы написали его в «ViewPager», но в чем его цель? Если вы хотите показать фрагмент B на основе выбора в фрагменте A, то «ViewPager» не является очевидным выбором. При этом забывайте о «аргументах», потому что вы не можете изменить их «на лету».Должен сделать простой сеттер. В качестве альтернативы, фрагмент B может быть контейнером для дочерних фрагментов, который вы можете заменить по выбору пользователя. –
У меня есть ViewPager, отображающий три вкладки салфетки, когда пользователь нажимает на список на первой вкладке (Fragment1). Я бы хотел, чтобы он переключился на вторую вкладку (Fragment2) и отобразил соответствующее изображение. Однако я хочу, чтобы пользователь также имел возможность прокручивать вторую вкладку (Fragment2), прежде чем выбрать что-то из списка, содержащегося на первой вкладке (Fragment1). –