【问题标题】:Changing ImageView Image depending on previous fragment - Viewpager根据先前的片段更改 ImageView 图像 - Viewpager
【发布时间】:2013-09-02 23:36:38
【问题描述】:

我有一个 CreateActivity.java,其中包含一个 viewpager 适配器,它启动两个 Fragment - 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);
    }
}

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)

附:第 209 行是:

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

【问题讨论】:

    标签: android android-fragments imageview android-viewpager bundle


    【解决方案1】:
    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);
    }
    

    【讨论】:

    • 这似乎也不起作用,我遇到的问题是,当放在 onCreateView() 或 onActivityCreated() 中时,我得到了 NPE。这是因为我试图返回一个在创建片段时不存在的整数。仅当用户单击列表视图中的项目时才会创建整数。
    • 为什么要创建没有整数值的片段?我知道你把它写在ViewPager 中,但这样做的目的是什么?如果您想根据片段 A 中的选择显示片段 B,那么 ViewPager 不是一个明显的选择。话虽如此,忘记“参数”,因为您无法即时更改这些参数。一个简单的二传手应该做。或者,片段 B 可以是子片段的容器,您可以根据用户的选择进行替换。
    • 我有一个 ViewPager 显示三个滑动选项卡,当用户单击第一个选项卡 (Fragment1) 上的列表视图时,我希望它切换到第二个选项卡 (Fragment2) 并显示相关图像。但是,我希望用户在从第一个选项卡 (Fragment1) 中包含的列表视图中选择某些内容之前,还可以选择能够滑动到第二个选项卡 (Fragment2)。
    【解决方案2】:

    这没有显示在错误消息中,但是通过查看代码,我会说空指针异常也来自:

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

    【讨论】:

    • 就是这样,因为直到用户在 Fragment1 中单击列表视图中的项目时才会创建整数,因此此方法还将返回 NPE。这就是我选择重写 setArguemnts() 方法的原因。另外,我认为 setArguments() 方法是在调用 onCreateView 之后调用的?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多