상대 레이아웃에서 보기를 프로그래밍 방식으로 레이아웃하는 방법은 무엇입니까?
XML을 통해 선언적으로 달성하는 것이 아니라 프로그래밍 방식으로 다음을 달성하려고 합니다.
<RelativeLayout...>
<TextView ...
android:id="@+id/label1" />
<TextView ...
android:id="@+id/label2"
android:layout_below: "@id/label1" />
</RelativeLayout>
다시 말해서, 어떻게 두 번째를 만들 수 있습니까?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);
제가 정리해 본 결과, 레이아웃 매개변수를 사용하여 보기를 추가해야 합니다.
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());
긴 이야기를 짧게 요약합니다. 상대 레이아웃을 사용하면 레이아웃 내부에 요소를 배치할 수 있습니다.
새 상대 레이아웃을 만듭니다.레이아웃 매개변수
RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(...)
(계속...상위 또는 줄 바꿈 내용 채우기, 필요한 경우 절대 번호 또는 XML 리소스 참조)
규칙 추가:규칙은 상위 또는 계층의 다른 "형제"를 나타냅니다.
lp.addRule(RelativeLayout.BELOW, someOtherView.getId()) lp.addRule(RelativeLayout.ALIGN_PARENT_LEFT)
레이아웃 매개 변수를 적용하면 됩니다.가장 '건강한' 방법은 다음과 같습니다.
parentLayout.addView(myView, lp)
주의:레이아웃 콜백에서 레이아웃을 변경하지 마십시오.보기가 실제 크기를 얻을 때이기 때문에 이렇게 하는 것이 좋습니다.하지만 그럴 경우 예상치 못한 결과가 예상됩니다.
이 문제로 4시간을 보냈습니다.0을 보기 ID로 사용하면 안 된다는 것을 마침내 깨달았습니다.당신은 그것이 NO_로 허용된다고 생각할 것입니다.ID == -1, 하지만 당신의 견해에 따르면 상황은 엉망이 되는 경향이 있습니다...
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 저장소입니다.
불러
tv1.setId(1)
끝나고
tv1.setText("A");
시도:
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);
ViewGroup을 사용한 이 접근 방식입니다.마진 레이아웃 매개 변수는 다음과 같습니다.
RelativeLayout myLayout = (RelativeLayout) findViewById(R.id.my_layout);
TextView someTextView = ...
int leftMargin = Util.getXPos();
int topMargin = Util.getYPos();
RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
new ViewGroup.MarginLayoutParams(
RelativeLayout.LayoutParams.WRAP_CONTENT,
RelativeLayout.LayoutParams.WRAP_CONTENT));
lp.setMargins(leftMargin, topMargin, 0, 0);
myLayout.addView(someTextView, lp);
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.activity_main);
final RelativeLayout relativeLayout = new RelativeLayout(this);
final TextView tv1 = new TextView(this);
tv1.setText("tv1 is here");
// Setting an ID is mandatory.
tv1.setId(View.generateViewId());
relativeLayout.addView(tv1);
final TextView tv2 = new TextView(this);
tv2.setText("tv2 is here");
// We are defining layout params for tv2 which will be added to its parent relativelayout.
// The type of the LayoutParams depends on the parent type.
RelativeLayout.LayoutParams tv2LayoutParams = new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.WRAP_CONTENT,
RelativeLayout.LayoutParams.WRAP_CONTENT);
//Also, we want tv2 to appear below tv1, so we are adding rule to tv2LayoutParams.
tv2LayoutParams.addRule(RelativeLayout.BELOW, tv1.getId());
//Now, adding the child view tv2 to relativelayout, and setting tv2LayoutParams to be set on view tv2.
relativeLayout.addView(tv2);
tv2.setLayoutParams(tv2LayoutParams);
//Or we can combined the above two steps in one line of code
//relativeLayout.addView(tv2, tv2LayoutParams);
this.setContentView(relativeLayout);
}
}
수동으로 레이아웃을 하려면 표준 레이아웃을 사용하지 않는 것이 좋습니다.모든 작업을 혼자서 수행합니다. 여기 코틀린 예가 있습니다.
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)
}
}
이것이 어떻게 작동하는지에 대한 아이디어를 줄 수 있습니다.
언급URL : https://stackoverflow.com/questions/2305395/how-to-lay-out-views-in-relativelayout-programmatically
'programing' 카테고리의 다른 글
CSS 선택기/HTML 속성에 대시가 선호되는 이유는 무엇입니까? (0) | 2023.08.04 |
---|---|
폴리곤 내 경계 상자 검색에 공간 인덱스가 사용되지 않음 (0) | 2023.08.04 |
IntelliJ Idea에서 스프링 부트 응용 프로그램을 시작할 수 없습니다. (0) | 2023.08.04 |
Oracle에서 Azure DB의 텍스트 필드로 clob 필드를 내보내는 중 오류 발생 (0) | 2023.08.04 |
Android TextView에서 텍스트 오른쪽 정렬 (0) | 2023.08.04 |