我有一个CreateActivity.java,它包含一个viewpager适配器,它启动两个Fragments - 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);
}
然后使用interface传递给主活动(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);
}
}
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 :(得分:0)
Fragment2 fragobj = new Fragment2();
fragobj.setArguments(args);
上面的问题是在setArguments()
中你试图在框架有机会创建它之前触摸片段的视图。基本上getView()
返回null
,因此返回NPE。
相反,将相关代码移动到视图所在的任何生命周期方法,即onCreateView()
or onActivityCreated()
。您可以通过调用getArguments()
:
@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);
}
答案 1 :(得分:0)
这不显示在错误消息中,但通过查看代码,我会说空指针异常也来自:
iv_ttx = (ImageView) getView().findViewById(R.id.iv_ttx);
您在片段管理器调用onCreateView()之前尝试获取视图。
您可以在onCreateView方法中执行此操作,而不是覆盖setArguments()方法。所以:
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%理解这个问题。