Android: LayoutParams для TextView программно закрывает представление

Я ударил это с разных сторон. В основном суть такова:

Я выложил шаблон в XML для интерфейса, который НЕОБХОДИМО запускать программно, поэтому он будет динамически заполняться во время запуска.

Проблема здесь в том, что XML TextView имеет довольно много настроек макета (которые работают) и необходимы. Но если я на самом деле устанавливаю их в коде, TextView даже не отображается.

(Кстати, TextView вложен в TableRow, таким образом, вызов веса.) XML-шаблон, который я разработал первым, чтобы использовать его в качестве ссылки для кода, таков, и он отлично работает:

<TextView
  android:id="@+id/txtviewWhiteBox"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_weight="1.0"
  android:background="@drawable/textview_9patch_white"
  android:gravity="center"
  android:text="75"
  android:textColor="@android:color/black"
  android:layout_margin="20dp"
  android:padding="20dp"
  android:textSize="40dp" />

Как я уже сказал, это идеально подходит. Когда я запускаю тот же макет в коде и применяю LayoutParams, TextView исчезает.

Вот соответствующий фрагмент:

int textViewExampleID = 9001;

private TextView txtviewExample = new TextView(this);

private void buildTextView(){   
    LayoutParams paramsExample = new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT,1.0f);
    txtviewExample.setId(textViewExampleID);
    txtviewExample.setBackgroundResource(R.drawable.textview_9patch_white);
    txtviewExample.setGravity(Gravity.CENTER);
    txtviewExample.setTextColor(getResources().getColor(android.R.color.black));
    paramsExample.setMargins(20, 20, 20, 20);
    txtviewExample.setPadding(20, 20, 20, 20);
    txtviewExample.setTextSize(40); 
    txtviewExample.setText("customExample");

    //if I comment out the following line, this TextView displays.
    //if I leave it in, it doesn't display.
    txtviewExample.setLayoutParams(paramsExample);
}

Я понимаю, что есть все виды доступных классов для LayoutParams, и я играл с ними всеми LinearLayout.LayoutParams, TableView.LayoutParams, RelativeLayout.LayoutParams, LayoutParams просто сам по себе... Независимо от того, какой из них я пытаюсь, любая попытка вызова "setLayoutParams" полностью удаляет TextView. Прошерстил тут форумы, ответа так и не нашел. Это не может быть НАСТОЛЬКО редкостью.


person Octoth0rpe    schedule 15.08.2012    source источник
comment
Пробовали ли вы TableRow.LayoutParams developer.android.com/reference/android/widget/   -  person code-jaff    schedule 15.08.2012
comment
Я ТОЛЬКО сделал (пропустил этот комментарий прошлой ночью, черт возьми), и это РАБОТАЛО. Спасибо чувак   -  person Octoth0rpe    schedule 15.08.2012


Ответы (3)


ну, это было больно, но я, наконец, понял это. Самое важное, что нужно помнить (что я только что понял), это то, что из всех бесчисленных LayoutParams вам нужно использовать тот, который относится к PARENT представления, над которым вы работаете, а не к фактическому представлению.

Итак, в моем случае я пытался заставить работать поля TextView, но они помещались внутри TableRow. Единственное простое изменение заключалось в том, что используемый тип LayoutParams был тем же, что и для TableRow:

private void buildTextView(){   
    // the following change is what fixed it
    TableRow.LayoutParams paramsExample = new TableRow.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT,1.0f);
    txtviewExample.setId(textViewExampleID);
    txtviewExample.setBackgroundResource(R.drawable.textview_9patch_white);
    txtviewExample.setGravity(Gravity.CENTER);
    txtviewExample.setTextColor(getResources().getColor(android.R.color.black));
    paramsExample.setMargins(20, 20, 20, 20);
    txtviewExample.setPadding(20, 20, 20, 20);
    txtviewExample.setTextSize(40); 
    txtviewExample.setText("customExample");
    txtviewExample.setLayoutParams(paramsExample);
}

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

person Octoth0rpe    schedule 15.08.2012
comment
СПАСИБО! У меня была та же проблема, потому что я использовал LinearLayout.LayoutParams вместо TableRow.LayoutParams... глупая ошибка, но вы спасли меня от большого разочарования! - person RyanG; 29.11.2012
comment
спасибо за понятное объяснение! Вы остановили несколько часов моих страданий! - person Roman; 06.03.2015
comment
Кто-нибудь может сказать мне, какой импорт использовался? - person Tanner Summers; 05.02.2016

private TextView txtviewExample = new TextView(this);

private void buildTextView(){   
    LayoutParams paramsExample = new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT,1.0f);
    txtviewExample.setId(textViewExampleID);
    txtviewExample.setBackgroundResource(R.drawable.textview_9patch_white);
    txtviewExample.setGravity(Gravity.CENTER);
    txtviewExample.setTextColor(getResources().getColor(android.R.color.black));
    paramsExample.setMargins(20, 20, 20, 20);
    txtviewExample.setPadding(20, 20, 20, 20);
    txtviewExample.setTextSize(40); 
    txtviewExample.setText("customExample");

   setContentView(txtviewExample);//when you don't use SETTER method for TextView you can't view the desireable text on the UI//
}

//использовать

person killer    schedule 24.07.2013
comment
используйте setContentView(txtviewExample), чтобы сделать текст видимым на экране пользовательского интерфейса - person killer; 24.07.2013
comment
Разве вы не можете просто прокомментировать вместо ответа на уже отвеченный вопрос ..? - person NREZ; 24.07.2013

что должна делать третья переменная в layoutparams, это альфа? что произойдет, если вы закомментируете paramsExample.setMargins

наконец, что произойдет, если вы txtviewExample.setVisible(View.Visible) после setLayoutParams?

это то, что я бы попробовал, если бы вы этого не сделали

person CQM    schedule 15.08.2012
comment
третья ссылка в layoutparams предназначена для веса, эквивалентного части android:layout_weight="1.0" в XML. и .setVisible(View.VISABLE); не сработало. Спасибо хоть. - person Octoth0rpe; 15.08.2012
comment
FWIW, я также пытался не использовать txtviewExample.setLayoutParms(paramsExample);, а затем во время фактического addView в макете указать его как вторичный параметр. Все еще не работает: tblrow.addView(txtviewExample,paramsExample); - person Octoth0rpe; 15.08.2012
comment
в setText я предполагаю, что у вас есть реальная строковая переменная? есть ли у этой переменной какие-либо данные, когда она вызывается? - person CQM; 15.08.2012
comment
Ага. Все работает по плану. Отступы, фон, размер/цвет/формулировка текста... ЕДИНСТВЕННАЯ вещь, для которой мне, кажется, нужен layoutParams, - это установить часть android:layout_margin="20dp", которая существует в XML. Когда я удаляю LayoutParams из кода, TextView отображается, но не в том месте из-за отсутствующих настроек полей. - person Octoth0rpe; 15.08.2012
comment
попробуйте удалить вес из параметров макета и попробуйте поместить текстовое представление в другой макет stackoverflow.com/a/4814716/727429 - person CQM; 15.08.2012
comment
да, я пробовал с атрибутом веса и без него, на самом деле это не имеет значения. (это в основном потому, что в моей таблице 4 столбца, и я хочу, чтобы это представление выполняло растяжение.) Полный макет: relativeLayout -> FrameLayout -> TableLayout -> TableRow -> TextView, поэтому размещение TextView в другом макете не совсем то решение, которое, как я надеюсь, существует. - person Octoth0rpe; 15.08.2012
comment
Что бы это ни стоило, поскольку ЕДИНСТВЕННАЯ настройка, для которой я действительно использую LayoutParams, - это строка android:layout_margin="20dp" из версии XML, я также пробовал это: MarginLayoutParams paramsExample = new MarginLayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT); ... тоже безрезультатно. - person Octoth0rpe; 15.08.2012
comment
Это только что: я также только что попытался поместить TextView в новый LinearLayout, а затем использовать только setLayoutParams в новом LinearLayout. RelativeLayout -> FrameLayout -> TableLayout -> TableRow -> LinearLayout -> TextView... Тем не менее, в этом представлении ничего не отображается. - person Octoth0rpe; 15.08.2012