Android получает ширину фрагмента - PullRequest
6 голосов
/ 23 марта 2012

У меня есть макет с 3 фрагментами:

<LinearLayout android:id="@+id/acciones"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">

<LinearLayout
android:id="@+id/fragment1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1">

</LinearLayout>


<LinearLayout
android:id="@+id/fragment2"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1">

</LinearLayout>

<LinearLayout
android:orientation="vertical"
android:id="@+id/f3"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1">

</LinearLayout>

</LinearLayout>

В первом фрагменте у меня есть TableLayout, в котором у меня есть один пользовательский TextView в каждой строке. Я хочу знать ширину фрагмента, потому что если пользовательский TextView шире, чем фрагмент, я задам необходимое количество строк.

Это то, что я сделал в своем пользовательском TextView:

@Override
protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);

mMaxWidth = (float) (getMeasuredWidth());
}

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

Спасибо.

1 Ответ

25 голосов
/ 24 марта 2012

Вы должны иметь возможность установить ширину TextView равным fill_parent, и в этом случае он будет выполнять перенос.Вы не должны устанавливать ширину ваших макетов равной match_parent, так как это неэффективно при использовании весов макета.

Поскольку система макетов в Android иногда бывает загадочной в отношении размеров просмотра, если для ширины TextView задано значениеНа самом деле fill_parent заставляет его занимать весь экран (как, по-видимому, подразумевает ваш вопрос), делает следующее:

Установите ширину TextView равной 0 по умолчанию.В onCreate вашей деятельности после установки представления содержимого:

findViewById(R.id.acciones).getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        final int fragmentWidth = findViewById(R.id.releventFragmentId).getWidth();
        if (fragmentWidth != 0){
            findViewById(R.id.yourTextViewId).getLayoutParams().width = fragmentWidth;
        }
    }
});

Установив ширину TextView равным 0, вы не позволяете ему изменять ширину фрагментов.Затем вы можете использовать обозреватель дерева представлений, чтобы получить ширину любого интересующего вас фрагмента (глядя на его корневой вид) после того, как макет произошел.Наконец, вы можете установить для вашего TextView именно такую ​​ширину, которая, в свою очередь, автоматически выполнит для вас обтекание.

Обратите внимание, что onGlobalLayout может вызываться несколько раз и регулярно вызываться до того, как все представления будут полностью заложены.отсюда, отсюда проверка! = 0.Вы также, вероятно, захотите сделать какую-то проверку, чтобы убедиться, что вы устанавливаете ширину текстового представления только один раз, или иначе вы можете попасть в бесконечный цикл макета (не конец света, но не хороший для производительности).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...