TextView 여백 변경 방법


82

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을 수정하는 올바른 방법입니까?
어떻게 작동하지 않는지.

답변:


187
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에 값을 제공 할 때 코드가 작동하지 않는 것입니다. 뷰의 참조를 만드는 위치에이 코드를 넣습니다.


이 호출은 API 레벨 19를 필요로
산 제이 쿠마에게

4
@SanjayKumar - 아니,이 API 레벨 19 요구한다는 제약 조건이 없습니다
Debarati

1
이것은 OP의 질문에 어떻게 대답합니까? 코드가 중복 된 추가 라인 설정 터치 리스너를 제외하고는 동일한 것 같습니다. invalidate ()를 호출하지 않고 생성자에서 LinearLayout.LayoutParams [LayoutParams.WRAP_CONTENT 대 LinearLayout.LayoutParams.WRAP_CONTENT]에 대한 인수를 명시 적으로 지정하지 않습니다. 또한 (중요 할 수는 없음) OP는 findViewById ()를 통해 레이아웃 xml에서 TextView를 얻지 만 프로그래밍 방식으로 생성 된 TextView에 여백을 설정하도록 요청합니다. 내가 ... 여기에 누락 무엇인지 궁금 해요
멜 키아 데스

@Melquiades는 귀하와 동의하며 질문에 답하지 않기 때문에 선택된 답변으로 제거되었으며 답변 Maybe as you are giving the value in -ve여백에 언급 된 바와 같이 -ve 값이 될 수 있습니다.
User7723337 2015-04-27

61

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 메서드를 사용하여 여백을 설정합니다.


이것은 나에게로 ClassCastException을 제공합니다 : -> ViewGroup.LayoutParams이 ViewGroup.MarginLayoutParams를 캐스팅 할 수 없습니다
Harshil Pansare에게

10

이것은 까다로운 문제입니다. 여백을 테이블 레이아웃의 행에서 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;

따라서 그에 따라 사용하십시오.


5

setMargins ()는 레이아웃 여백이 아닌 TextView의 내부 여백을 설정합니다. 그게 당신이하고 싶은 일입니까? 이 두 가지 다른 여백은 매우 복잡 할 수 있습니다.

레이아웃 여백을 설정하려면 TextView의 LayoutParams (textview.getLayoutParams ()를 변경 한 다음 반환 된 LayoutParams 객체의 매개 변수를 변경합니다)를 변경합니다.

LinearLayout에서 아무것도 변경할 필요가 없습니다.

감사합니다, Oliver


3

TextView는 setMargins를 지원하지 않습니다. Android 문서 는 다음과 같이 말합니다.

뷰는 패딩을 정의 할 수 있지만 여백을 지원하지 않습니다. 그러나 뷰 그룹은 이러한 지원을 제공합니다. 자세한 내용은 ViewGroup 및 ViewGroup.MarginLayoutParams를 참조하십시오.


1

여기 또 다른 접근 방식이 있습니다 ...

동일한 문제가 발생했을 때 여기에 제안 된 솔루션이 마음에 들지 않았습니다. 그래서 다른 방법을 생각해 냈습니다. 두 개의 중요한 필드로 분리하려는 두 필드 사이의 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 용이지만 다른 레이아웃으로 수행 할 수 있습니다.

도움이 되었기를 바랍니다.


0

레이아웃 여백을 그린 후에 변경했을 수 있습니다. mOldTextView.invalidate ()는 쓸모가 없습니다. 새 구성을 릴레이하려면 부모에서 requestLayout ()을 호출해야했습니다. 도면이 발생하기 전에 레이아웃 변경 코드를 이동하면 모든 것이 정상적으로 작동했습니다.


0
        TextView tv = (TextView)findViewById(R.id.item_title));
        RelativeLayout.LayoutParams mRelativelp = (RelativeLayout.LayoutParams) tv
                    .getLayoutParams();
        mRelativelp.setMargins(DptoPxConvertion(15), 0, DptoPxConvertion (15), 0);
        tv.setLayoutParams(mRelativelp);

    private int DptoPxConvertion(int dpValue)
    {
       return (int)((dpValue * mContext.getResources().getDisplayMetrics().density) + 0.5);
    }

textview의 getLayoutParams ()는 xml의 ​​textview 부모를 기반으로 해당 Params로 캐스팅되어야합니다 .

<RelativeLayout>
   <TextView
    android:id="@+id/item_title">
</RelativeLayout>

다른 장치에서 동일한 실제 크기를 렌더링하려면 위에서 사용한 DptoPxConvertion () 메서드를 사용하십시오. setMargin (left, top, right, bottom) 매개 변수는 dp가 아닌 픽셀 값을 사용 합니다 . 자세한 내용은이 링크 답변을 참조하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.