Ширина LayoutParams игнорируется для внешнего вида при установке в коде Java (вместо макета XML) - PullRequest
2 голосов
/ 28 октября 2010

Я создаю очень простое действие, в котором я создаю и устанавливаю представление в коде Java вместо XML. Ширина, которую я передаю внешнему LinearLayout, не имеет никакого эффекта (200). Представление отображается по всей ширине экрана, независимо от того, какое значение я передаю здесь.

(Обратите внимание, что это всего лишь пример кода; я знаю, что в реальном приложении вы не используете фиксированные значения. Я просто хочу указать на мою проблему здесь для упрощения пояснения).

public class MyActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // outer linear layout
        LinearLayout ll = new LinearLayout(this);
        ll.setLayoutParams(new LinearLayout.LayoutParams(
                200,   // *** this param has no effect, regardless of the value I set here ***
                LinearLayout.LayoutParams.FILL_PARENT
        ));
        ll.setBackgroundColor(Color.parseColor("#00ff00"));


        // inner linear layout
        LinearLayout ll2 = new LinearLayout(this);
        ll2.setLayoutParams(new LinearLayout.LayoutParams(
                100,    // ** this width for the inner view is working fine **
                LinearLayout.LayoutParams.FILL_PARENT
        ));
        ll2.setBackgroundColor(Color.parseColor("#0000ff"));
        ll.addView(ll2);

        setContentView(ll);
    }
}

Но если я заменю setContentView(ll); и использую вместо этого макет xml, где внешний LinearLayout имеет значение 200px, он применяется правильно, и представление занимает только 200px экрана.

setContentView(com.example.R.layout.main);

где main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="200px"
    android:layout_height="fill_parent"
    android:background="#ff0000"
    >
    <TextView  
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello"
        />
</LinearLayout>

Почему установка фиксированной ширины в Java-коде для внешнего макета не имеет никакого эффекта?

Ответы [ 4 ]

1 голос
/ 29 октября 2010

Я полагаю, что это ошибка в Android, подал отчет об ошибке на

http://code.google.com/p/android/issues/detail?id=12244

0 голосов
/ 21 ноября 2014

Я решил эту проблему, используя приведенное ниже решение. Вы должны позвонить getLayoutParams на ваш view's родительский макет. Но у вашего внешнего макета не будет родителя. Если вы хотите установить layoutparams для вашего внешнего макета, вы должны позвонить geLayoutParams на ViewGroup

 LinearLayout ll = new LinearLayout(this);
    ll.setLayoutParams(new ViewGroup.LayoutParams(
            200,   // *** this param has no effect, regardless of the value I set here ***
            ViewGroup.LayoutParams.FILL_PARENT
    ));
0 голосов
/ 29 октября 2010

Я не могу сказать вам 'почему' точно, но, возможно, у xml есть своего рода "невидимый родитель", чтобы обеспечить привязку.Если вы отчаянно нуждаетесь в обходном пути, тогда очевидный ответ - обернуть его невидимым внешним родителем, например так:

    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // very, very outer Linear layout!
    LinearLayout ll_InvisibleParent = new LinearLayout(this);
    ll_InvisibleParent.setBackgroundColor(Color.parseColor("#000000"));

    // outer Linear layout
    LinearLayout ll = new LinearLayout(this);
    //
    ll.setLayoutParams(new LinearLayout.LayoutParams(
            200,   // *** this param has no effect, regardless of the value I set here ***
            LinearLayout.LayoutParams.FILL_PARENT
    ));
    ll.setBackgroundColor(Color.parseColor("#00ff00"));// green

    // inner Linear layout
    LinearLayout ll2 = new LinearLayout(this);
    ll2.setLayoutParams(new LinearLayout.LayoutParams(
            100,    //  this width for the inner view is working fine 
            LinearLayout.LayoutParams.FILL_PARENT
    ));
    ll2.setBackgroundColor(Color.parseColor("#0000ff"));// blue
    ll.addView(ll2);
    //setContentView(ll); REPLACED WITH INVISIBLE PARENT
    ll_InvisibleParent.addView(ll);
    setContentView(ll_InvisibleParent);
}

, который мне подходит

0 голосов
/ 29 октября 2010

Вы можете попробовать это так.

  LinearLayout ll = new LinearLayout(this);       
  LinearLayout.LayoutParams lparam = new LinearLayout.LayoutParams(
                LayoutParams.WRAP_CONTENT, LayoutParams.FILL_PARENT);
  lparam.width = 200;

  ll.setLayoutParams(lparam);
  ll.setBackgroundColor(Color.parseColor("#00ff00"));

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