Не удалось получить ширину представления во время выполнения с использованием привязки данных - PullRequest
0 голосов
/ 29 мая 2018

В моем xml есть ImageView, который использует библиотеку привязки данных, и его высота равна «match_parent». Теперь у меня есть требование изменить его высоту во время выполнения, но когда я получаю его ширину, он всегда дает мне 0, какчтобы получить его фактический размер ширины?

У меня есть это ниже ImageView в моем xml:

<ImageView
    android:layout_width="match_parent"
    android:layout_height="200dp"
    android:scaleType="centerCrop"
    app:imageUrl="@{data.bannerImage}"
    tools:src="@drawable/iop"
    android:src="@drawable/iop"/>

, и я устанавливаю его высоту с отношением ширины, используяниже код Java

@Override
public void onResume() {
   super.onResume();

   mBinding.notifyChange();
   mBinding.bannerImage.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
       @Override
       public void onGlobalLayout() {
           ViewGroup.LayoutParams params = mBinding.bannerImage.getLayoutParams();
           Log.e("tag","mBinding.bannerImage.getWidth()=="+mBinding.tvReviews.getWidth());
           params.height= (int)(mBinding.tvReviews.getWidth()/1.75);
           mBinding.bannerImage.setLayoutParams(params);
           Log.e("tag,"params.height=="+params.height);
           mBinding.bannerImage.getViewTreeObserver().removeOnGlobalLayoutListener(this);
           mBinding.notifyPropertyChanged(com.webkul.mobikulmp.BR.bannerImage);
       }
   });
}

здесь mBinding = DataBindingUtil.setContentView (this, R.layout.activity_seller_profile) ;, // замените ваш xml здесь, но я всегда получаю 0, возвращенный дляmBinding.bannerImage.getWidth ().Я также пытался задать фиксированную ширину для ImageView, а также получить ее ширину для некоторого слушателя нажатия кнопки, но все напрасно.

Любая помощь приветствуется

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

Поскольку вы добавляете ViewTreeObserver для ImageView и получаете ширину TextView "tvReviews".поэтому измените код как показано ниже

mBinding.bannerImage.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            ViewGroup.LayoutParams params = mBinding.bannerImage.getLayoutParams();
            Log.e("tag","mBinding.bannerImage.getWidth()=="+mBinding.bannerImage.getWidth());
            params.height= (int)(mBinding.bannerImage.getWidth()/1.75);
            mBinding.bannerImage.setLayoutParams(params);
            Log.e("tag,"params.height=="+params.height);
                    mBinding.bannerImage.getViewTreeObserver().removeOnGlobalLayoutListener(this);
            mBinding.notifyPropertyChanged(com.webkul.mobikulmp.BR.bannerImage);
        }
    });
0 голосов
/ 29 мая 2018

Вы можете использовать приведенный ниже код, чтобы получить ширину и высоту просмотра во время выполнения

 int Height, Width;
    final ImageView imgview = (ImageView)findViewById(R.id.scaled_image);
    ViewTreeObserver vto = imgview .getViewTreeObserver();
    vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
        public boolean onPreDraw() {
            imgview .getViewTreeObserver().removeOnPreDrawListener(this);
            Height = imgview .getMeasuredHeight();
            Width = imgview .getMeasuredWidth();
            tv.setText("Height: " + Height + " Width: " + Width);
            return true;
        }
    });
...