Android LayoutParams не обновляется должным образом - PullRequest
1 голос
/ 18 октября 2019

Итак, у меня есть вид с прокруткой, и мне нужно отрегулировать высоту своего вида с прокруткой, чтобы убедиться, что он остается выше модального всплывающего вида. Я не могу использовать макет ограничения, потому что это модальное всплывающее представление не является потомком того же родителя представления. Поэтому я пытаюсь динамически обновить параметры макета представлений прокрутки, чтобы его высота была достаточно маленькой, чтобы не скрываться за модальным всплывающим окном.

Высота всплывающего вида может изменяться в точках, поэтому у меня есть обратный вызов, который возвращает новую высоту модального вида каждый раз, когда он изменяется. В этом обратном вызове я настраиваю высоту прокрутки следующим образом:

someModalView.onHeightChanged = { newViewHeight ->
    Log.d("TESTHEIGHT", "PreHeight = ${scrollView.height}")
    scrollView.layoutParams = FrameLayout.LayoutParams(scrollView.width, scrollView.height - newViewHeight)
    scrollView.requestLayout()
    Log.d("TESTHEIGHT", "PostHeight = ${scrollView.height}")
}

К сожалению, приведенный выше код, похоже, ничего не делает, и в моих журналах я вижу, что PreHeight печатает ту же высоту, что и PostHeight. Любая причина, по которой высота просмотров не меняется?

Кроме того, я отладил ее и убедился, что newViewHeight не равен 0, и это не так, это ~ 800


Закончилось тем, что все заработало, добавив к виду отступ, а не изменив его высоту, например:

someModalView.onHeightChanged = { newViewHeight ->
    scrollView.setPadding(0, 0, 0, newViewHeight)
}

Это работает именно так, как мне было нужно, но на самом деле это не отвечает на вопрос, поэтому я простооставьте это в ответе для любого, кому это могло бы помочь. Но все равно было бы неплохо знать, почему изменение параметров макета не приведет к обновлению высоты просмотров.

Ответы [ 2 ]

0 голосов
/ 19 октября 2019

Как только мне нужно было получить высоту softKeyboard, чтобы обновить мой вид:

    public class MainActivity extends AppCompatActivity {

    private ScrollView sView;
    private int heightDiff;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        sView = findViewById(R.id.scrollView);
        //Here we get the height of soft keyboard by observing changes of softKeyboard height.
        sView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            public void onGlobalLayout() {
                heightDiff = sView.getRootView().getHeight() - sView.getHeight();
            }
        });


        final EditText email = findViewById(R.id.eemail);
        EditText firstName = findViewById(R.id.efirstname);
        firstName.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                if (!isVisibleWhileSoftKeyboardShowing(email) && hasFocus) {
                    sView.postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            sView.smoothScrollBy(0, 200);
                        }
                    }, 500);
                }

            }
        });
    }

    /**
     * check if a view is currently visible in the screen or not
     *
     * @param view
     * @return
     */
    public boolean isVisibleWhileSoftKeyboardShowing(final View view) {
        if (view == null) {
            return false;
        }
        if (!view.isShown()) {
            return false;
        }
        final Rect actualPosition = new Rect();
        view.getGlobalVisibleRect(actualPosition);
        final Rect screen = new Rect(0, 0, getScreenWidth(), getScreenHeight() - heightDiff);
        return actualPosition.intersect(screen);
    }


    /**
     * to get screen width
     *
     * @return
     */
    public static int getScreenWidth() {
        return Resources.getSystem().getDisplayMetrics().widthPixels;
    }

    /**
     * to get screen height
     *
     * @return
     */
    public static int getScreenHeight() {
        return Resources.getSystem().getDisplayMetrics().heightPixels;
    }
}

heightDiff - это высота softKeyboard. Было 2 редактируемых текста. Я хотел прокрутить, если softKeyboard скрыл нижний. Надеюсь, что это похоже на ваш случай.

0 голосов
/ 19 октября 2019

постарайтесь увидеть, как это работает для вас

val params = scrollView.layoutParams;
params.height = scrollView.height - newViewHeight
scrollView.layoutParams = params
...