как программно получить высоту вида с помощью кнопок на нем? - PullRequest
4 голосов
/ 23 января 2012

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

final LinearLayout tv = (LinearLayout)findViewById(R.id.thebuttons);
    ViewTreeObserver vto = tv.getViewTreeObserver();
    vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
        public void onGlobalLayout() {
            Integer grr = tv.getHeight();
            Log.e("the h", grr.toString());
            ViewTreeObserver obs = tv.getViewTreeObserver();
            obs.removeGlobalOnLayoutListener(this);
        }
    });

Теперь, если я установлю его на любой из моих других макетов, я получу высоту, как я ожидаю, но установлю его на этот, и я получу 0; и это тот, который я пытаюсь измерить! Я также пытался измерить кнопку напрямую, но безрезультатно

<LinearLayout
 android:id="@+id/thebuttons"
 android:orientation="horizontal"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_gravity="center_horizontal"
 android:layout_marginTop="5sp"
>
<Button
    android:id="@+id/saveit"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Save" />
<Button
    android:id="@+id/clearit"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Save" />
</LinearLayout>

1 Ответ

12 голосов
/ 23 января 2012

Я наконец-то понял это сам если виджеты не появляются на экране, они не создаются. таким образом, элементы кнопки, где все еще в нуле, потому что они никогда не визуализируются; и они никогда не отображались, потому что представление прокрутки отталкивало их от экрана. поэтому на этот раз я атаковал проблему под другим углом, установив представление прокрутки на произвольное небольшое число, чтобы кнопки оставались на экране, получали размер сохраненного макета верхнего уровня, равный «int totalsize», затем я получаю размеры всех элементов, кроме представления с прокруткой, также получили поля для каждого представления и суммировали их все в «int used», затем я установил высоту представления прокрутки как «totalsize-used», и это то, что сработало. обнаружил, что я суммировал поля вручную, что не работает, когда размер экрана изменяется, поля также меняются, поэтому лучше всего их обнаруживать вместе с размерами вида.

в моем методе создания я получил это:

final Button tv = (Button)findViewById(R.id.saveit);
    ViewTreeObserver vto = tv.getViewTreeObserver();
    vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
        public void onGlobalLayout() {
            ViewGroup.MarginLayoutParams vlp = (MarginLayoutParams) tv.getLayoutParams();
            int btnsize =tv.getMeasuredHeight()+vlp.topMargin;
            sizeit(btnsize);
            ViewTreeObserver obs = tv.getViewTreeObserver();
            obs.removeGlobalOnLayoutListener(this);
        }
    });

а затем размер его функции

private void sizeit(Integer thebuttons)
{
    View v = findViewById(R.id.viewmain);
    int total = v.getHeight();
    v = findViewById(R.id.view1);
    ViewGroup.MarginLayoutParams vlp = (MarginLayoutParams) v.getLayoutParams();
    int used=v.getHeight()+vlp.topMargin;
    v = findViewById(R.id.view2);
    vlp = (MarginLayoutParams) v.getLayoutParams();
    used+=v.getHeight()+vlp.topMargin;
    v = findViewById(R.id.fonttext);
    vlp = (MarginLayoutParams) v.getLayoutParams();
    used+=v.getHeight()+vlp.topMargin;
    v = findViewById(R.id.infolabel);
    vlp = (MarginLayoutParams) v.getLayoutParams();
    used+=v.getHeight()+vlp.topMargin;
    Integer scrsize=total-used-thebuttons;
    v = findViewById(R.id.scrview);

    ScrollView scr = (ScrollView)findViewById(R.id.scrview);
    ViewGroup.LayoutParams scrlprams = scr.getLayoutParams();
    scrlprams.height=scrsize;
    scr.setLayoutParams(scrlprams);
}

надеюсь, это поможет кому-то, кто борется с той же проблемой

...