236

私は(XMLを介して宣言的にではなく)プログラムで次のことを達成しようとしています:

<RelativeLayout...>
   <TextView ...
      android:id="@+id/label1" />
   <TextView ...
      android:id="@+id/label2"
      android:layout_below: "@id/label1" />
</RelativeLayout>

言い換えると、2番目をTextView最初のものの下に表示するにはどうすればよいですか?しかし、コードでそれを行いたいと思います:

RelativeLayout layout = new RelativeLayout(this);
TextView label1 = new TextView(this);
TextView label2 = new TextView(this);
...
layout.addView(label1);
layout.addView(label2);
setContentView(layout);

アップデート:

ありがとう、TreeUK。一般的な方向性は理解していますが、それでも機能しません。「B」が「A」と重なっています。私は何が間違っているのですか?

RelativeLayout layout = new RelativeLayout(this);
TextView tv1 = new TextView(this);
tv1.setText("A");

TextView tv2 = new TextView(this);
tv2.setText("B");
RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
        RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.FILL_PARENT);
lp.addRule(RelativeLayout.RIGHT_OF, tv1.getId());

layout.addView(tv1);        
layout.addView(tv2, lp);
4

9 に答える 9

197

私がまとめたものから、LayoutParams を使用してビューを追加する必要があります。

LinearLayout linearLayout = new LinearLayout(this);

RelativeLayout.LayoutParams relativeParams = new RelativeLayout.LayoutParams(
        LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
relativeParams.addRule(RelativeLayout.ALIGN_PARENT_TOP);

parentView.addView(linearLayout, relativeParams);

アイテムをプログラムで相対的に配置するには、アイテムに ID を割り当てる必要があります。

TextView tv1 = new TextView(this);
tv1.setId(1);
TextView tv2 = new TextView(this);
tv2.setId(2);

それでaddRule(RelativeLayout.RIGHT_OF, tv1.getId());

于 2010-02-21T11:57:48.957 に答える
61

簡単に言うと、相対レイアウトでは、要素をレイアウト内に配置します。

  1. 新しい RelativeLayout.LayoutParams を作成します

    RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(...)
    

    (何であれ...親を埋めるかコンテンツをラップするか、必要に応じて絶対数、または XML リソースへの参照)

  2. ルールの追加: ルールは、階層内の親または他の「兄弟」を参照します。

    lp.addRule(RelativeLayout.BELOW, someOtherView.getId())
    lp.addRule(RelativeLayout.ALIGN_PARENT_LEFT)
    
  3. レイアウト パラメータを適用するだけです。これを行う最も「健全な」方法は次のとおりです。

    parentLayout.addView(myView, lp)
    

注意: レイアウト コールバックからレイアウトを変更しないでください。これはビューが実際のサイズを取得するときであるため、そうするのは魅力的です。ただし、その場合、予期しない結果が予想されます。

于 2011-01-04T09:36:25.650 に答える
29

この問題に4時間費やしました。最後に、ビュー id としてゼロを使用してはならないことに気付きました。NO_ID == -1として許可されていると思うかもしれませんが、ビューにそれを与えると、事態は混乱する傾向があります...

于 2011-09-29T16:26:38.213 に答える
9

Android 22 の最小限の実行可能な例

ここに画像の説明を入力

ソース:

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.RelativeLayout;
import android.widget.TextView;

public class Main extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        final RelativeLayout relativeLayout = new RelativeLayout(this);

        final TextView tv1;
        tv1 = new TextView(this);
        tv1.setText("tv1");
        // Setting an ID is mandatory.
        tv1.setId(View.generateViewId());
        relativeLayout.addView(tv1);

        // tv2.
        final TextView tv2;
        tv2 = new TextView(this);
        tv2.setText("tv2");
        RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
                ViewGroup.LayoutParams.WRAP_CONTENT,
                ViewGroup.LayoutParams.FILL_PARENT);
        lp.addRule(RelativeLayout.BELOW, tv1.getId());
        relativeLayout.addView(tv2, lp);

        // tv3.
        final TextView tv3;
        tv3 = new TextView(this);
        tv3.setText("tv3");
        RelativeLayout.LayoutParams lp2 = new RelativeLayout.LayoutParams(
            ViewGroup.LayoutParams.WRAP_CONTENT,
            ViewGroup.LayoutParams.WRAP_CONTENT
        );
        lp2.addRule(RelativeLayout.BELOW, tv2.getId());
        relativeLayout.addView(tv3, lp2);

        this.setContentView(relativeLayout);
    }
}

によって生成された既定のプロジェクトで動作しますandroid create project ...最小限のビルド コードを含む GitHub リポジトリ

于 2016-02-02T21:43:31.307 に答える
7

電話

tv1.setId(1) 

tv1.setText("A");
于 2010-03-23T12:15:00.720 に答える
4

試す:

EditText edt = (EditText) findViewById(R.id.YourEditText);
RelativeLayout.LayoutParams lp =
    new RelativeLayout.LayoutParams
    (
        LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT
    );
lp.setMargins(25, 0, 0, 0); // move 25 px to right (increase left margin)
edt.setLayoutParams(lp); // lp.setMargins(left, top, right, bottom);
于 2013-12-13T09:25:09.800 に答える
0

本当に手動でレイアウトしたい場合は、標準レイアウトをまったく使用しないことをお勧めします。すべて自分で行ってください。ここに kotlin の例があります。

class ProgrammaticalLayout @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) : ViewGroup(context, attrs, defStyleAttr) { 
    private val firstTextView = TextView(context).apply {
        test = "First Text"
    }

    private val secondTextView = TextView(context).apply {
        text = "Second Text"
    }

    init {
        addView(firstTextView)
        addView(secondTextView)
    }

    override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) {
        // center the views verticaly and horizontaly
        val firstTextLeft = (measuredWidth - firstTextView.measuredWidth) / 2
        val firstTextTop = (measuredHeight - (firstTextView.measuredHeight + secondTextView.measuredHeight)) / 2
        firstTextView.layout(firstTextLeft,firstTextTop, firstTextLeft + firstTextView.measuredWidth,firstTextTop + firstTextView.measuredHeight)

        val secondTextLeft = (measuredWidth - secondTextView.measuredWidth) / 2
        val secondTextTop = firstTextView.bottom
        secondTextView.layout(secondTextLeft,secondTextTop, secondTextLeft + secondTextView.measuredWidth,secondTextTop + secondTextView.measuredHeight)
    }

    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { 
        // just assume we`re getting measured exactly by the parent
        val measuredWidth = MeasureSpec.getSize(widthMeasureSpec)
        val measuredHeight = MeasureSpec.getSize(heightMeasureSpec)

        firstTextView.measures(MeasureSpec.makeMeasureSpec(meeasuredWidth, MeasureSpec.AT_MOST), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED))
        secondTextView.measures(MeasureSpec.makeMeasureSpec(meeasuredWidth, MeasureSpec.AT_MOST), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED))

        setMeasuredDimension(measuredWidth, measuredHeight)
    }
}

これにより、これがどのように機能するかがわかります

于 2017-01-04T16:11:39.473 に答える