2017-08-04 4 views
0

基本的に、フラグメント内のメソッドに画像ビューまたはビューを渡そうとすると、結果はnullになります。私が今までにできる最高のものは、最低でもクラッシュしないコードの下にあった。私は2つの断片を膨らませている。なにが問題ですか?フラグメント内のメソッドにイメージビューを渡すにはどうしたらいいですか?

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> 

FRAGMENTのCODE

レイアウトは、2つのXMLファイルを持っています

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メソッドに渡すにはどうすればよいですか?

+0

我々は必要レイアウトコードを確認するには、onCreateViewではなくonViewCreatedを使用してビューを検索することをお勧めします。 OnViewCreatedは引数として既に膨らんだビューを持っています.ctrl + oを押すとoberwrite – cutiko

答えて

0

レイアウトコードが表示されない場合は、コールバックを使用することをおすすめします。

アクティビティクラスにインターフェイスを実装します。ここで、メソッドは、イメージビューを変更または使用する実行するロジックです。次に、画像ビューをonShareItemに渡す代わりに、 'this'を渡して必要なパラメータでコールバックを呼び出すことができます。

+0

サンプルコードを教えてください。 – afazolo

1

アクティビティに属し、まだ作成されていないため、onViewCreatedでimage_previewを実行できません。あなたが活動中でImageViewのを見つけなければならないが

断片にonActivityCreatedオーバーライドとは、あなたがonViewCreatedで使用しているビューは、フラグメントレイアウトです:。

getActivity()findViewById ...

+0

あなたの平均はここと同じですか? https://stackoverflow.com/a/24417087/751630 – afazolo

+0

閉じる、フラグメント内でfindViewById()directltを使用することはできません。最初にビューにアクセスし、必要なものを見つけ出す必要があります。 Insight onActivityCreatedはgetActivity()を使用します。findViewById(); – cutiko

関連する問題