0

基本上,当我尝试将图像视图或视图传递给片段中的方法时,结果为空。到目前为止,我能做到的最好的就是下面的代码,至少不会崩溃。我正在膨胀两个片段。怎么了?

布局有两个xml文件:

fragment_image_slider.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">

<android.support.v4.view.ViewPager
    android:id="@+id/viewpager"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/black" />

...

<RelativeLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true">

    <ImageView
        android:id="@+id/sharethis"
        android:clickable="true"
    ...
        android:src="@drawable/ic_share" />

    ...

</RelativeLayout>

</RelativeLayout>

image_fullscreen_preview.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/RelativeLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/black">

...

<ImageView
    android:id="@+id/image_preview"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_centerInParent="true"
    android:scaleType="fitCenter" />

</RelativeLayout>

片段代码

private ImageView deleteThis, shareThis;    

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
           View v = inflater.inflate(R.layout.fragment_image_slider, container, false);
           shareThis = (ImageView) v.findViewById(R.id.sharethis);
    ...
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {

    layoutInflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View view = 
    layoutInflater.inflate(R.layout.image_fullscreen_preview, container, false);
    final ImageView imageViewPreview = (ImageView) view.findViewById(R.id.image_preview);

      Image image = images.get(position);

        Glide
                .with(getActivity())
                .load(image.getPhotoUrl())
                .thumbnail(0.5f)
                .crossFade()
                .diskCacheStrategy(DiskCacheStrategy.ALL)
                .listener(new RequestListener<String, GlideDrawable>() {
                    @Override
                    public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) {
                        progressBar.setVisibility(View.GONE);
                        return false;
                    }

                    @Override
                    public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
                        progressBar.setVisibility(View.GONE);
                        return false;
                    }
                })
                .into(imageViewPreview);

        shareThis.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                onShareItem(imageViewPreview);
            }
        });

        container.addView(view);

        return view;
    }

    public void onShareItem(ImageView v) {
    //ImageView ivImage = (ImageView) v.findViewById(R.id.image_preview); if I use `View v` as parameter the app crashes
    Uri bmpUri = getLocalBitmapUri(v); // return null
       ...
    }

如何将此变量传递给onShareItem方法?

4

2 回答 2

1

您不能在 onViewCreated 中获取 image_preview,因为它属于 Activity 并且尚未创建。

在 Fragment 中覆盖 onActivityCreated ,您必须在 Activity 中找到 ImageView,您在 onViewCreated 中使用的视图是您的片段布局:

getActivity().findViewById...

于 2017-08-04T22:23:38.880 回答
0

如果看不到布局代码,我建议您可以使用回调。

在您的活动类中实现一个接口,其中它的方法是您希望执行的用于修改或使用您的图像视图的逻辑。然后,您可以传递“this”并使用您需要的任何参数调用回调,而不是将 imageview 传递给您的 onShareItem。

于 2017-08-04T20:02:42.757 回答