#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:
Почему вы хотите узнать это в «// здесь». Вы не используете эту переменную там. Ваш код не объясняет, почему невозможно определить переменную во время прокрутки.