LinearLayout에 프로그래밍 방식으로 TextView를 추가했으며 일부 외부 이벤트에서 해당 TextView의 아래쪽 여백을 -10으로 줄이고 싶습니다.
LinearLayout.LayoutParams lastTxtParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
lastTxtParams.setMargins(0, 0, 0, -10);
mOldTextView.setLayoutParams(lastTxtParams);
mOldTextView.invalidate();
View에 추가 된 위젯의 Margin을 수정하는 올바른 방법입니까?
어떻게 작동하지 않는지.
답변
TextView forgot_pswrd = (TextView) findViewById(R.id.ForgotPasswordText);
forgot_pswrd.setOnTouchListener(this);
LinearLayout.LayoutParams llp = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
llp.setMargins(50, 0, 0, 0); // llp.setMargins(left, top, right, bottom);
forgot_pswrd.setLayoutParams(llp);
나는 이것을했고 완벽하게 작동했습니다. -ve에 값을 제공 할 때 코드가 작동하지 않는 것입니다. 뷰의 참조를 만드는 위치에이 코드를 넣습니다.
답변
xml의 레이아웃에는 이미 layout_margin (Left | Right | etc) 속성이있을 수 있습니다. 즉, 해당 xml에 의해 생성 된 객체에 액세스하여 수정해야합니다.
이 솔루션이 매우 간단하다는 것을 알았습니다.
ViewGroup.MarginLayoutParams mlp = (ViewGroup.MarginLayoutParams) mTextView
.getLayoutParams();
mlp.setMargins(adjustmentPxs, 0, 0, 0);
break;
textview의 LayoutParams 인스턴스를 가져 와서 MarginLayoutParams로 다운 캐스트하고 setMargins 메서드를 사용하여 여백을 설정합니다.
답변
이것은 까다로운 문제입니다. 여백을 테이블 레이아웃의 행에서 textview로 설정했습니다. 아래를 참조하십시오.
TableLayout tl = new TableLayout(this);
tl.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
TableRow tr = new TableRow(this);
tr.setBackgroundResource(R.color.rowColor);
LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
params.setMargins(4, 4, 4, 4);
TextView tv = new TextView(this);
tv.setBackgroundResource(R.color.textviewColor);
tv.setText("hello");
tr.addView(tv, params);
TextView tv2 = new TextView(this);
tv2.setBackgroundResource(R.color.textviewColor);
tv2.setText("hi");
tr.addView(tv2, params);
tl.addView(tr);
setContentView(tl);
테이블 행에서 사용하기 위해 LayoutParams를 가져 오는 데 필요한 클래스는 다음과 같습니다.
import android.widget.**TableRow**.LayoutParams;
테이블 행에 대한 클래스를 추가했습니다. 비슷하게 다음과 같은 LayoutParams를 사용하기 위해 다른 많은 클래스를 사용할 수 있습니다.
import android.widget.**RelativeLayout**.LayoutParams;
import android.widget. LinearLayout .LayoutParams;
따라서 그에 따라 사용하십시오.
답변
setMargins ()는 레이아웃 여백이 아닌 TextView의 내부 여백을 설정합니다. 그게 당신이하고 싶은 일입니까? 이 두 가지 다른 여백은 매우 복잡 할 수 있습니다.
레이아웃 여백을 설정하려면 TextView의 LayoutParams (textview.getLayoutParams ()를 변경 한 다음 반환 된 LayoutParams 객체의 매개 변수를 변경합니다)를 변경합니다.
LinearLayout에서 아무것도 변경할 필요가 없습니다.
감사합니다, Oliver
답변
TextView는 setMargins를 지원하지 않습니다. Android 문서 는 다음과 같이 말합니다.
뷰는 패딩을 정의 할 수 있지만 여백을 지원하지 않습니다. 그러나 뷰 그룹은 이러한 지원을 제공합니다. 자세한 내용은 ViewGroup 및 ViewGroup.MarginLayoutParams를 참조하십시오.
답변
여기 또 다른 접근 방식이 있습니다 …
동일한 문제가 발생했을 때 여기에 제안 된 솔루션이 마음에 들지 않았습니다. 그래서 다른 방법을 생각해 냈습니다. 두 개의 중요한 필드로 분리하려는 두 필드 사이의 XML 파일에 TextView를 삽입했습니다.
- 가시성을 “GONE”으로 설정 (공간을 차지하지 않음 ..)
-
높이는 분리가 필요한 수준으로 설정됩니다.
XML: ...//some view up here <TextView android:id="@+id/dialogSeparator" android:layout_width="match_parent" android:layout_height="30dp" android:visibility="gone"/> ...//some view down here
이제, 나는 코드, 내가 그것을 수행하는 데 필요한 모든 것은 가시성을 보이지 않게 변경합니다 (즉, 거기에 있고 필요한 공간을 차지하지만 보이지 않습니다)
JAVA:
TextView tvSeparator = (TextView)activity.findViewById(R.id.dialogSeparator);
tvSeparator.setVisibility(View.INVISIBLE);
//Inside an activity extended class I can use 'this' instead of 'activity'.
비올라 … 필요한 마진을 얻었습니다. BTW,이 솔루션은 세로 방향의 LinearLayout 용이지만 다른 레이아웃으로 수행 할 수 있습니다.
도움이 되었기를 바랍니다.
답변
레이아웃 여백을 그린 후에 변경했을 수 있습니다. mOldTextView.invalidate ()는 쓸모가 없습니다. 새 구성을 릴레이하려면 부모에서 requestLayout ()을 호출해야했습니다. 도면이 발생하기 전에 레이아웃 변경 코드를 이동하면 모든 것이 정상적으로 작동했습니다.