Android LinearLayout 자동 줄 바 꾸 기

이전 항목 에서 자동 으로 줄 을 바 꾸 는 선형 레이아웃 을 사 용 했 기 때문에 표 레이아웃 으로 자바 코드 로 ImageView 를 추가 하려 고 했 으 나 추 가 된 View 컨트롤 은 확실 하지 않 습 니 다.서버 데이터 로 돌아 가 야 하기 때문에 수 동 으로 자바 코드 로 레이아웃 을 그 리 는 방식 이 이렇게 요절 되 었 습 니 다.사촌 형 레이아웃 에서 한 줄 에 몇 개의 ImageView 를 표시 하 는 지 확인 할 수 없 기 때문에 동적 으로 추가 할 수 없습니다.마지막 으로 줄 을 바 꿀 수 있 는 선형 레이아웃 을 직접 볼 수 있 습 니 다.선형 레이아웃 이 비교적 좋 지 않 은 것 은 자동 으로 줄 을 바 꿀 수 없습니다.즉,LinearLayout 를 설정 한 orentation 이 vertical 을 수직 방향 으로 설정 하면 한 열 만 있 습 니 다.줄 마다 View 나 View 의 하위 클래스 만 표시 할 수 있 습 니 다.LinearLayout 의 orentitation 을 Horizontal 로 설정 하면 LinearLayout 는 한 줄 로 만 표시 되 고 가로 로 만 표시 되 며 화면 이 가득 찼 을 때 View 컨트롤 은 자동 으로 줄 을 바 꾸 지 않 습 니 다.그래서 우리 가 해 야 할 일 은 LinearLayout 가 가득 찼 을 때 자동 으로 줄 을 바 꾸 는 것 입 니 다.
하위 컨트롤 의 길이 와 너비 에 따라 부모 컨트롤 의 너비 와 높이 를 어떻게 그 리 는 지 알 아야 합 니 다.그래서 들 어 와 야 할 매개 변수 컨트롤 의 높이 는 보 기 는 View 형식 으로 나 뉘 는데 대표 적 인 컨트롤 은 TextView,Button,EditText 등 이 있 습 니 다.그리고 보 기 를 담 은 용기 컨트롤 은 View Group 의 컨트롤,예 를 들 어 LinearLayout,RelativeLayout,TabHost 등 컨트롤 을 계승 합 니 다.자동 으로 줄 을 바 꾸 는 선형 레이아웃 이 필요 하 다 면 하위 컨트롤 의 높이 와 너비 에 따라 부모 컨트롤 의 높이 와 폭 을 동적 으로 불 러 와 야 하기 때문에 구조 함수 에서 모든 키 컨트롤 의 고정 높이 나 동적 으로 하위 컨트롤 의 높이 와 폭 을 설정 해 야 합 니 다.
사용자 정의 LinearLayout 도 ViewGroup 에서 계승 하고 추상 적 인 ViewGroup 을 다시 쓰 는 몇 가지 방법:onMeasure(),onLayout(),dispathDraw()  세 가지 방법 은 첫 번 째 onMeasure()는 컨트롤 과 하위 컨트롤 이 사용 하 는 영역 을 계산 하 는 것 이 고,두 번 째 onLayout()는 하위 컨트롤 의 줄 을 바 꾸 는 것 이 며,세 번 째 는 쓸 수 있 고 쓸 수 있 으 며,주로 컨트롤 의 테 두 리 를 그 리 는 것 이다.
사용자 정의 LinearLayout 코드 는 다음 과 같 습 니 다.

package com.huanglong.mylinearlayout;
 
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
 
/**
 * @author huanglong 2013-5-28        LinearLayout
 */
public class FixGridLayout extends ViewGroup {
 private int mCellWidth;
 private int mCellHeight;
 
 public FixGridLayout(Context context) {
  super(context);
 }
 
 public FixGridLayout(Context context, AttributeSet attrs) {
  super(context, attrs);
 }
 
 public FixGridLayout(Context context, AttributeSet attrs, int defStyle) {
  super(context, attrs, defStyle);
 }
 
 public void setmCellWidth(int w) {
  mCellWidth = w;
  requestLayout();
 }
 
 public void setmCellHeight(int h) {
  mCellHeight = h;
  requestLayout();
 }
 
 /**
  *         
  */
 @Override
 protected void onLayout(boolean changed, int l, int t, int r, int b) {
  int cellWidth = mCellWidth;
  int cellHeight = mCellHeight;
  int columns = (r - l) / cellWidth;
  if (columns < 0) {
   columns = 1;
  }
  int x = 0;
  int y = 0;
  int i = 0;
  int count = getChildCount();
  for (int j = 0; j < count; j++) {
   final View childView = getChildAt(j);
   //      Child   
   int w = childView.getMeasuredWidth();
   int h = childView.getMeasuredHeight();
   //           
   int left = x + ((cellWidth - w) / 2);
   int top = y + ((cellHeight - h) / 2);
   // int left = x;
   // int top = y;
   //      
   childView.layout(left, top, left + w, top + h);
 
   if (i >= (columns - 1)) {
    i = 0;
    x = 0;
    y += cellHeight;
   } else {
    i++;
    x += cellWidth;
 
   }
  }
 }
 
 /**
  *             
  */
 @Override
 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  //       
  int cellWidthSpec = MeasureSpec.makeMeasureSpec(mCellWidth, MeasureSpec.AT_MOST);
  int cellHeightSpec = MeasureSpec.makeMeasureSpec(mCellHeight, MeasureSpec.AT_MOST);
  //   ViewGroup Child    
  int count = getChildCount();
  //      Child   
  for (int i = 0; i < count; i++) {
   View childView = getChildAt(i);
   /*
    * 090 This is called to find out how big a view should be. 091 The
    * parent supplies constraint information in the width and height
    * parameters. 092 The actual mesurement work of a view is performed
    * in onMeasure(int, int), 093 called by this method. 094 Therefore,
    * only onMeasure(int, int) can and must be overriden by subclasses.
    * 095
    */
   childView.measure(cellWidthSpec, cellHeightSpec);
  }
  //             
  //   setMeasuredDimension resolveSize   
  setMeasuredDimension(resolveSize(mCellWidth * count, widthMeasureSpec),
    resolveSize(mCellHeight * count, heightMeasureSpec));
  // setMeasuredDimension(widthMeasureSpec, heightMeasureSpec);
 
  //           
  // super.onMeasure(widthMeasureSpec, heightMeasureSpec);
 }
 
 /**
  *        
  */
 @Override
 protected void dispatchDraw(Canvas canvas) {
  //         
  int width = getWidth();
  int height = getHeight();
  //     
  Paint mPaint = new Paint();
  //          
  mPaint.setColor(Color.BLUE);
  mPaint.setStyle(Paint.Style.STROKE);
  mPaint.setStrokeWidth(10);
  mPaint.setAntiAlias(true);
  //      
  Rect mRect = new Rect(0, 0, width, height);
  //     
  canvas.drawRect(mRect, mPaint);
  //            
  super.dispatchDraw(canvas);
 }
 
}
그리고 Xml 파일 에서 자신 이 정의 한 컨트롤 을 참조 하여 자바 코드 에서 호출 합 니 다.

package com.huanglong.mylinearlayout;
 
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.CheckBox;
import android.widget.SimpleAdapter;
import android.support.v4.app.NavUtils;
 
public class MainActivity extends Activity {
 private SimpleAdapter adapter;
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  FixGridLayout fixGridLayout = (FixGridLayout) findViewById(R.id.ll);
  fixGridLayout.setmCellHeight(30);
  fixGridLayout.setmCellWidth(100);
  for (int i = 0; i < 7; i++) {
   CheckBox box = new CheckBox(MainActivity.this);
   box.setText(" "+i+" ");
   fixGridLayout.addView(box);
  }
 }
 
 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
  getMenuInflater().inflate(R.menu.activity_main, menu);
  return true;
 }
 
 
}
효과 캡 처:

이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기