Android 根据以前的片段更改ImageView图像-Viewpager

Android 根据以前的片段更改ImageView图像-Viewpager,android,android-fragments,imageview,android-viewpager,bundle,Android,Android Fragments,Imageview,Android Viewpager,Bundle,我有一个CreateActivity.java,其中包含一个viewpager适配器,它启动两个片段——Fragment1.java和Fragment2.java。在Fragment1.java中,我有一个listFragment设置,当用户单击该列表上的一个项目时,我想将视图切换到Fragment2.java,并更改Fragment2.java(图像)中的内容。到目前为止我所做的: 在Fragment1.java中,为listview设置onClickListener: @Override p

我有一个CreateActivity.java,其中包含一个viewpager适配器,它启动两个片段——Fragment1.java和Fragment2.java。在Fragment1.java中,我有一个listFragment设置,当用户单击该列表上的一个项目时,我想将视图切换到Fragment2.java,并更改Fragment2.java(图像)中的内容。到目前为止我所做的:

在Fragment1.java中,为listview设置onClickListener:

@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);
}
然后通过重写setArguments方法将该值回调到Fragment2.java中:

    @Override
    public void setArguments(Bundle args) {
    super.setArguments(args);
    int pos = args.getInt(ARG_POSITION, position);
    Log.w("myApp", "" + pos);
}
现在如何根据整数位置设置所需的图像?我尝试过像这样编辑图像视图,但是得到了一个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);
    }
}
日志:

    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)
第209行是:

    iv_ttx = (ImageView) getView().findViewById(R.id.iv_ttx);
上面的问题是,在
setArguments()
中,您试图在框架有机会创建片段之前触摸片段的视图。基本上
getView()
返回
null
,因此NPE

相反,将相关代码移到视图存在的任何生命周期方法,即
onCreateView()
或onActivityCreated()
。通过调用
getArguments()
,可以获取设置的参数:


错误消息中没有显示这一点,但通过查看代码,我认为空指针异常也可能来自:

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%理解这个问题。

这似乎也不起作用,我的问题是,当放置在onCreateView()或onActivityCreated()中时,我会得到NPE。这是因为我试图返回一个在创建片段时不存在的整数。只有当用户单击listview中的项目时,才会创建整数。为什么要创建没有该整数值的片段?我知道你写的是一个
浏览页面
,但它的目的是什么?如果您想根据片段a中的选择显示片段B,那么
ViewPager
不是一个明显的选择。也就是说,忘记“论点”,因为你不能在瞬间改变它们。一个简单的setter就可以了。或者,片段B可以是子片段的容器,您可以根据用户的选择进行替换。我有一个显示三个滑动选项卡的ViewPager,当用户单击第一个选项卡(片段1)上的listview时,我希望它切换到第二个选项卡(片段2)并显示相关图像。但是,我希望用户在从第一个选项卡(Fragment1)中包含的listview中选择某个内容之前,还可以选择滑动到第二个选项卡(Fragment2)。这就是问题所在,因为直到用户在Fragment1中单击listview中的某个项目时,才会创建整数,所以此方法还将返回NPE。这就是我选择重写setArguemnts()方法的原因。另外,我认为setArguments()方法是在调用onCreateView之后调用的?
iv_ttx = (ImageView) getView().findViewById(R.id.iv_ttx);
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;
}