0

У меня есть 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); 

ответ

0
Fragment2 fragobj = new Fragment2(); 
fragobj.setArguments(args); 

Проблема выше, что в setArguments() вы пытаетесь коснуться вид фрагмента до рамки была возможность создать его. В основном getView() возвращает null, следовательно, NPE.

Вместо этого переместите соответствующий код на любой из методов жизненного цикла, в которых существует вид, то есть onCreateView()or onActivityCreated(). Вы можете получить набор аргументов, вызвав :

@Override public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    int pos = getArguments().getInt(ARG_POSITION, position); 
    Log.w("myApp", "" + pos); 
    iv_ttx = (ImageView) getView().findViewById(R.id.iv_ttx); 
    iv_ttx.setImageResource(pos == 0 ? R.drawable.img1 : R.drawable.img2); 
} 
+0

Это тоже не работает, проблема в том, что при размещении в onCreateView() или onActivityCreated() я получаю NPE. Это потому, что я пытаюсь вернуть целое число, которое не существует при создании фрагмента. Целое число создается только тогда, когда пользователь нажимает на элемент в списке. –

+0

Зачем вам создавать фрагмент без этого целочисленного значения? Я понимаю, что вы написали его в «ViewPager», но в чем его цель? Если вы хотите показать фрагмент B на основе выбора в фрагменте A, то «ViewPager» не является очевидным выбором. При этом забывайте о «аргументах», потому что вы не можете изменить их «на лету».Должен сделать простой сеттер. В качестве альтернативы, фрагмент B может быть контейнером для дочерних фрагментов, который вы можете заменить по выбору пользователя. –

+0

У меня есть ViewPager, отображающий три вкладки салфетки, когда пользователь нажимает на список на первой вкладке (Fragment1). Я бы хотел, чтобы он переключился на вторую вкладку (Fragment2) и отобразил соответствующее изображение. Однако я хочу, чтобы пользователь также имел возможность прокручивать вторую вкладку (Fragment2), прежде чем выбрать что-то из списка, содержащегося на первой вкладке (Fragment1). –

0

Это не отображается в сообщении об ошибке, но, посмотрев на код, я бы сказал, что нулевое исключение указатель также будет приходить от:

iv_ttx = (ImageView) getView().findViewById(R.id.iv_ttx); 

Вы пытаетесь получить представление до того, как диспетчер фрагментов вызывается onCreateView().

Вместо того, чтобы переопределять метод setArguments(), вы можете сделать это в методе onCreateView. Таким образом:

public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.your_fragment_id, container, false); 
    ImageView iv_ttx = view.findViewById(R.id.iv_ttx); 
    int pos = getArguments().getInt(ARG_POSITION); 
    if (pos == 0) { 
     iv_ttx.setImageResource(R.drawable.img1); 
    } else if (pos == 1){ 
     iv_ttx.setImageResource(R.drawable.img2); 
    } 
    return view; 
} 

Надеюсь, что это поможет. Я, возможно, не понял 100% вопроса.

+0

Это то, потому что целое число не создается, пока пользователь не нажмет элемент в списке в Fragment1, этот метод также вернет NPE. Вот почему я решил переопределить метод setArguemnts(). Кроме того, я думал, что метод setArguments() называется AFTER onCreateView? –

Смежные вопросы