[android] TextView 여백 변경 방법

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를 삽입했습니다.

  1. 가시성을 “GONE”으로 설정 (공간을 차지하지 않음 ..)
  2. 높이는 분리가 필요한 수준으로 설정됩니다.

    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 ()을 호출해야했습니다. 도면이 발생하기 전에 레이아웃 변경 코드를 이동하면 모든 것이 정상적으로 작동했습니다.