Можно ли повторно использовать LayoutPrams с ViewGroup.addView?

Использует ли ViewGroup.addView клоны LayoutParams данные внутри или ссылки на него? Можно ли повторно использовать один и тот же экземпляр LayoutParams с несколькими вызовами addView() с разными представлениями?

В apidoc ничего нет.

WOW

Ответ НЕТ (проверено экспериментально):

public class SymbolPadActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    RelativeLayout.LayoutParams labelParams;

    /*
     * This block to reuse is not working
    labelParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
    labelParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT, RelativeLayout.TRUE);
    labelParams.addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE);
    */


    RelativeLayout mover = new RelativeLayout(this);

    TextView textView;
    for(int leftMargin = 0; leftMargin<3000; leftMargin += 100) {
        for(int topMargin=0; topMargin<800; topMargin += 40) {

            // I can't omit these 3 lines 
            labelParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
            labelParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT, RelativeLayout.TRUE);
            labelParams.addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE);

            labelParams.leftMargin = leftMargin;
            labelParams.topMargin = topMargin;

            textView = new TextView(this);
            textView.setText("(" + leftMargin + "," + topMargin + ")");
            mover.addView(textView, labelParams);

        }
    }




    RelativeLayout.LayoutParams moverParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
    moverParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT, RelativeLayout.TRUE);
    moverParams.addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE);
    moverParams.leftMargin = 0;
    moverParams.topMargin = 0;

    RelativeLayout stator = new RelativeLayout(this);
    stator.addView(mover, 0, moverParams);

    setContentView(stator);


}

}

Ответ 1

  В apidoc ничего об этом нет.

Это означает, что вам нужно сделать более консервативный выбор независимо от текущей реализации, поскольку реализация может измениться.

Следовательно, вы должны предположить, что небезопасно повторно использовать экземпляр LayoutParams с другим Views.

Насколько это стоит, насколько я могу судить, это так или иначе - ViewGroup не делает копию.

Ответ 2

Это старый вопрос, но, похоже, есть обновленный ответ:

LayoutParams имеет конструктор для копирования другого Источник: http://developer.android.com/reference/android/view/ViewGroup.LayoutParams.html

ViewGroup.LayoutParams(ViewGroup.LayoutParams source)

Это предполагает не повторное использование, а, возможно, создание 1 объекта params layout со всем, что вам нужно, а затем просто вызовите

new LayoutParams(someLayoutParamsToReUse)

В моем случае я хотел установить параметры макета кнопки так же, как и другая кнопка. Сначала я попробовал:

button.setLayoutParams(button2.getLayoutParams());

Это не сработает, однако это должно:

button.setLayoutParams(new LayoutParms(button2.getLayoutParams))'