Размер представления вертикальной прокрутки Android Java

#java #android #size #scrollview #screen

#java #Android #размер #scrollview #экран

Вопрос:

У меня есть очень простое действие с видом вертикальной прокрутки ( mainscreen.xml ниже).

Этот вид вертикальной прокрутки имеет дочерний вид линейной компоновки.

Я динамически добавляю текстовые представления как дочерние элементы к этому линейному макету ( populateLinlayWithTextViews() ниже).

Позже, после добавления этих дочерних элементов текстового представления, я могу прокручивать вид вертикальной прокрутки ( onScrollChange() ниже).

И я могу измерить видимую часть вертикальной прокрутки ( getHeight() ).

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

mainscreen.xml

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

    <ScrollView
        android:id="@ id/scrollview"
        android:layout_height="wrap_content"
        android:layout_width="match_parent">

        <LinearLayout
            android:id="@ id/linlay"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">

        </LinearLayout>
    </ScrollView>
</LinearLayout>
  

MyActivity.java

 protected void onCreate(@Nullable Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);

    setContentView(R.layout.mainscreen);

    Resources resources = getResources();
    int n_statusBarHeight = resources.getIdentifier( "status_bar_height", "dimen", "android"); // 36px

    populateLinlayWithTextViews();

    // HERE
    ScrollView sv = sv = findViewById(R.id.scrollview);
    int n_svVisiblePartHeight = sv.getHeight(); // 0px

    View.OnScrollChangeListener onScrollChangedListener
    = new View.OnScrollChangeListener()
    {
        @Override
        public void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY)
        {
            ScrollView sv = sv = findViewById(R.id.scrollview);
            int n_svVisiblePartHeight = sv.getHeight(); // 680px
        }
    }

    sv = findViewById(R.id.scrollview);
    sv.setOnScrollChangeListener(onScrollChangedListener);
}

public void populateLinlayWithTextViews()
{
    LinearLayout linlay = findViewById(R.id.linlay);
    int n_viewHeight = 81; // px

    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
            LinearLayout.LayoutParams.MATCH_PARENT,
            n_viewHeight);

    for(int n_i=0 ; n_i<20 ; n_i  )
    {
        TextView tvNew = new TextView(m_app);
        tvNew.setText(n_i   " - test");
        tvNew.setTextColor(Color.rgb(0, 0, 0)); // black
        tvNew.setTextSize(TypedValue.COMPLEX_UNIT_SP, 40);
        tvNew.setLayoutParams(params);

        linlay.addView(tvNew, linlay.getChildCount());
    }
}
  

Когда я прокручиваю вид вертикальной прокрутки, я вижу, что n_svVisiblePartHeight значение равно 680px .

Но мне нужно знать это значение раньше // HERE .

Но // HERE значение, которое я получаю, таково 0px .

Можете ли вы мне помочь?

РЕДАКТИРОВАТЬ 1

Мне нужно знать эту высоту, потому что:

  • пример 1: я хотел бы изначально узнать индекс текстового представления, который будет находиться в нижней части (видимого) экрана после того, как я заполнил линейный макет текстовыми представлениями ;
  • пример 2: учитывая эту высоту X , которую я ищу, допустим, я хотел бы 10 , чтобы текстовые представления были видны изначально, я хотел бы определить X/10 , какой будет высота текстовых представлений, чтобы я мог вводить ее динамически n_viewHeight .

РЕДАКТИРОВАТЬ 2

Мне просто нужно знать высоту красной стрелки ниже, как можно скорее в жизненном цикле действия и желательно до того, как я добавлю текстовые представления в линейный макет или сразу после ( // HERE ):

Высота, которую я ищу.

РЕДАКТИРОВАТЬ 3

Я не знаю, верно ли это теоретически:

 n_scrollViewVisibleHeightInPx =
    n_displayHeightInPx
  - n_actionBarHeight
  - n_navigationBarHeightInPx
    n_statusBarHeightInPx;
  

… но практически n_scrollViewVisibleHeightInPx это высота пространства, обозначенного красной стрелкой на изображении выше.

Чтобы получить эти различные высоты, ниже приведены методы, которые я использовал:

 private int returnStatusBarHeightInPx()
{
int       n_statusBarHeightInPx = -1;
Resources resources             = null;
int       n_idStatusBarHeight   = -1;

    resources = getResources();

    n_idStatusBarHeight = resources.getIdentifier( "status_bar_height", "dimen", "android");
    if(n_idStatusBarHeight > 0)
    {
        n_statusBarHeightInPx = getResources().getDimensionPixelSize(n_idStatusBarHeight);
    }
    else
    {
        n_statusBarHeightInPx = 0;
    }
    return n_statusBarHeightInPx;
}

private int returnNavigationBarHeightInPx()
{
int       n_navigationBarHeightInPx = -1;
Resources resources                 = null;
int       n_idNavigationBarHeight   = -1;

    resources = getResources();
    n_idNavigationBarHeight = resources.getIdentifier("navigation_bar_height", "dimen", "android");

    if(n_idNavigationBarHeight > 0)
    {
        n_navigationBarHeightInPx = getResources().getDimensionPixelSize(n_idNavigationBarHeight);
    }
    else
    {
        n_navigationBarHeightInPx = 0;
    }
    return n_navigationBarHeightInPx;
}

private int returnActionBarHeightInPx()
{
TypedValue typedValue            = null;
int        n_actionBarHeightInPx = -1;

    typedValue = new TypedValue();

    if(getTheme().resolveAttribute(android.R.attr.actionBarSize, typedValue, true))
    {
        n_actionBarHeightInPx =
                TypedValue.complexToDimensionPixelSize(
                            typedValue.data,
                            getResources().getDisplayMetrics());
    }

    return n_actionBarHeightInPx;
}

private int returnDisplayHeightInPx()
{
DisplayMetrics displayMetrics      = null;
int            n_displayHeightInPx = -1;

    displayMetrics = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
    n_displayHeightInPx = displayMetrics.heightPixels;

    return n_displayHeightInPx;
}
  

Ответ №1:

Почему вы хотите узнать это в «// здесь». Вы не используете эту переменную там. Ваш код не объясняет, почему невозможно определить переменную во время прокрутки.