2016-08-17 2 views
0

詳細アクティビティ(デバイスに小さいビューポートがある場合)またはメインアクティビティ(ビューポートが大きい場合、たとえばタブレット)にあるフラグメントがあります。フラグメントの幅を取得すると、viewtreeobserverリスナーが機能しない

フラグメント内には、フラグメントの幅に応じてサイズを変更する必要があるImageViewがあります。私はいくつかの調査を行い、これを達成するための "標準的な"方法は、viewtreeobserverにリスナーを追加することであることがわかりました。しかし、何らかの理由で、動作していない:私はonactivitycreatedコールバックにリスナーを呼び出す

public class MediaDetailFragment extends Fragment implements DetailsMvpView { 

    private static final String RESOURCE = "resource"; 

    @Inject DetailPresenter mPresenter; 
    @BindView(R.id.media_image_flipper) 
    ViewFlipper mImageFlipper; 
    @BindView(R.id.title_textview) 
    TextView mTitleTextView; 
    @BindView(R.id.button_share) 
    ImageButton mShare; 
    @BindView(R.id.button_trailers) ImageButton mTrailers; 
    @BindView(R.id.keyword_recyclerview) 
    RecyclerView mKeywordRecyclerView; 
    @BindView(R.id.overview_content_textview) TextView mOverviewTextView; 
    @BindView(R.id.main_image_holder) ViewGroup mImageHolder; 
    @BindView(R.id.parent_cardview) 
    CardView mParentCardView; 

    @BindString(R.string.youtube_base_url) String mYoutubeUrl; 
    @BindBool(R.bool.isTablet) boolean mIsTablet; 

    private Media mMedia; 
    private DisplayMetrics mDisplayMetrics = new DisplayMetrics(); 

    public static MediaDetailFragment insertOnTarget(AppCompatActivity activity, int target, Media media) { 
     MediaDetailFragment fragment = MediaDetailFragment.instantiateWithArguments(media); 
     FragmentManager fm = activity.getSupportFragmentManager(); 
     fm.beginTransaction() 
       .replace(target, fragment) 
       .setCustomAnimations(android.R.anim.slide_in_left, android.R.anim.slide_out_right) 
       .commit(); 
     return fragment; 
    } 

    @Override 
    public void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     mMedia = getArguments().getParcelable(RESOURCE); 
    } 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, 
          @Nullable Bundle savedInstanceState) { 

     View rootView = inflater.inflate(R.layout.media_details_fragment, container, false); 
     ((BaseActivity)getActivity()).activityComponent().inject(this); 
     ButterKnife.bind(this, rootView); 

     getActivity().getWindowManager().getDefaultDisplay().getMetrics(mDisplayMetrics); 



     mTitleTextView.setText(mMedia.title()); 
     mOverviewTextView.setText(mMedia.overview()); 

     mKeywordRecyclerView.setAdapter(new KeywordAdapter(getContext())); 

     return rootView; 
    } 

    @Override 
    public void onActivityCreated(@Nullable Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 

     final View view = getView(); 
     if (view == null) return; 
     view.getViewTreeObserver().addOnGlobalLayoutListener(() -> { 
      if (mIsTablet) { 
       mImageFlipper.getLayoutParams().height = 
         ViewUtil.setHeightForAspectRatio(view.getWidth(), ViewUtil.PORTRAIT); 
      } else { 
       mImageFlipper.getLayoutParams().height = 
         ViewUtil.setHeightForAspectRatio(mDisplayMetrics.widthPixels, ViewUtil.PORTRAIT); 
      } 
     }); 
    } 

    @Override 
    public void onStart() { 
     super.onStart(); 
     mShare.setOnClickListener(v -> {startActivity(new Intent(Intent.ACTION_SEND) 
       .putExtra(Intent.EXTRA_TEXT, String.format(mYoutubeUrl, mMedia.overview())));}); 
     mTrailers.setOnClickListener(v -> mPresenter.loadMovies(mMedia.id())); 
     mPresenter.attachView(this); 
     mPresenter.loadImages(mMedia.id()); 
     mPresenter.loadKeywords(mMedia.id()); 
    } 


    @Override 
    public void onStop() { 
     mPresenter.detachView(); 
     super.onStop(); 
    } 

    @Override 
    public void showImages(String images) { 
     ImageView imageView = new ImageView(getContext()); 
     ViewUtil.loadImage(images, imageView, getContext(), true, true); 
     mImageFlipper.addView(imageView, new ViewGroup.LayoutParams(
       ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); 
    } 

    @Override 
    public void showKeywords(List<String> keywords) { 
     ((KeywordAdapter) mKeywordRecyclerView.getAdapter()).setKeywords(keywords); 
    } 

    @Override 
    public void showVideos(List<Video> videos) { 
     TrailerDialogFragment.newInstance(videos).show(getFragmentManager(), null); 
    } 

    @Override 
    public void showError() { 

    } 

    private static MediaDetailFragment instantiateWithArguments(Media media) { 
     Bundle bundle = new Bundle(); 
     bundle.putParcelable(RESOURCE, media); 
     MediaDetailFragment fragment = new MediaDetailFragment(); 
     fragment.setArguments(bundle); 
     return fragment; 
    } 

} 

これは私の断片です。

欠けている部分を見つけ出す手伝いをしてもらえますか?

ありがとうございます。

答えて

1

コードは、実行時にラップすると機能します。これは私の解決策です:

@Override 
public void onActivityCreated(@Nullable Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 

    final View view = getView(); 
    if (view == null) return; 
    view.getViewTreeObserver().addOnGlobalLayoutListener(() -> { 
     view.post(() -> { 
      if (mIsTablet) { 
       mImageFlipper.getLayoutParams().height = 
         ViewUtil.setHeightForAspectRatio(view.getWidth(), ViewUtil.PORTRAIT); 
      } else { 
       mImageFlipper.getLayoutParams().height = 
         ViewUtil.setHeightForAspectRatio(mDisplayMetrics.widthPixels, ViewUtil.PORTRAIT); 
      } 
     }); 

    }); 
} 

私は最終的にそれを解決することができましたが、なぜ私は理解できません。なぜこれが起こったのかも知れば、私に知らせてください。

関連する問題