2016-08-25 5 views
0

저는 X 축 Y 그리드에 자식을 표시하는 사용자 정의 GroupView 클래스를 작성했습니다. 아이들은 사각형입니다.FrameLayout에서 TextView가 표시되지 않습니다.

package com.roundel.calc2; 

import android.content.Context; 
import android.content.res.TypedArray; 
import android.util.AttributeSet; 
import android.util.DisplayMetrics; 
import android.view.Gravity; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.Button; 
import android.widget.FrameLayout; 
import android.widget.LinearLayout; 
import android.widget.TextView; 
import android.widget.Toast; 

public class CalcPadLayout extends ViewGroup { 
private int mRowCount; 
private int mColumnCount; 
public CalcPadLayout(Context context, AttributeSet attrs, int defStyle) 
{ 
    super(context, attrs, defStyle); 
    final TypedArray a = context.obtainStyledAttributes(attrs, 
      new int[] { android.R.attr.rowCount, android.R.attr.columnCount }, defStyle, 0); 
    mRowCount = a.getInt(0, 1); 
    mColumnCount = a.getInt(1, 1); 
    a.recycle(); 
} 

public CalcPadLayout(Context context, AttributeSet attrs) { 
    this(context, attrs, 0); 
} 

public CalcPadLayout(Context context) { 
    this(context, null); 
} 

@Override 
protected void onLayout(boolean changed, int left, int top, int right, int bottom) { 
    final int paddingLeft = getPaddingLeft(); 
    final int paddingRight = getPaddingRight(); 
    final int paddingTop = getPaddingTop(); 
    final int paddingBottom = getPaddingBottom(); 

    final int childCount = getChildCount(); 
    final int height = bottom-top-paddingBottom-paddingTop; 
    final int width = right-left-paddingLeft-paddingRight; 
    final int childSize = Math.min(Math.round(width/mColumnCount), Math.round(height/mRowCount)); 

    /*DisplayMetrics displayMetrics = getResources().getDisplayMetrics(); 
    float dpHeight = displayMetrics.heightPixels/displayMetrics.density; 
    float dpWidth = displayMetrics.widthPixels/displayMetrics.density;*/ 
    int rowIndex = 0, columnIndex = 0; 
    for(int i = 0; i < childCount; i++) 
    { 
     View child = getChildAt(i); 
     final int childTop = rowIndex*childSize+paddingTop; 
     final int childLeft = columnIndex*childSize+paddingLeft; 
     final int childBottom = childTop+childSize; 
     final int childRight = childLeft+childSize; 
     //child.setGravity(Gravity.CENTER_HORIZONTAL); 
     child.layout(childLeft, childTop, childRight, childBottom); 
     rowIndex = (rowIndex + (columnIndex + 1)/mColumnCount) % mRowCount; 
     columnIndex = (columnIndex + 1) % mColumnCount; 
    } 
    LayoutParams params = this.getLayoutParams(); 
    params.height = childSize*mRowCount+paddingTop+paddingBottom; 
    this.setLayoutParams(params); 
} 
} 

이것은 내 main_layout.xml입니다. 그들이 제대로 표시되는 경우 내가 볼 수 있도록 나는 FrameLayouts의 배경 색상을 설정합니다, 두 FrameLayouts 내부 디스플레이 두 TextViews을 수 있습니다 :

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout android:layout_height="match_parent" 
    android:layout_width="match_parent" 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:gravity="bottom"> 

    <com.roundel.calc2.CalcPadLayout 
     android:paddingBottom="@dimen/activity_vertical_margin" 
     android:paddingTop="@dimen/activity_vertical_margin" 
     android:paddingRight="@dimen/activity_horizontal_margin" 
     android:paddingLeft="@dimen/activity_horizontal_margin" 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_height="wrap_content" 
     android:layout_width="wrap_content" 
     android:rowCount="1" 
     android:columnCount="2" 
     android:background="@color/greyDark" 
     android:gravity="bottom"> 


     <FrameLayout 
      android:layout_width="wrap_content" 
      android:layout_height="match_parent" 
      android:background="@color/colorPrimary"> 

      <TextView 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:text="New Text" 
       android:id="@+id/textView" 
       android:gravity="center" 
       android:textColor="@color/white" 
       android:textSize="35sp"/> 
     </FrameLayout> 

     <FrameLayout 
      android:layout_width="wrap_content" 
      android:layout_height="match_parent" 
      android:background="@color/colorPrimaryDark"> 

      <TextView 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:text="New Text" 
       android:id="@+id/textView2" 
       android:gravity="center" 
       android:textColor="@color/white" 
       android:textSize="35sp"/> 
     </FrameLayout> 

    </com.roundel.calc2.CalcPadLayout> 
</LinearLayout> 

레이아웃이 제대로 표시되어, 그러나 텍스트 뷰가 보이지 않는 Inside FrameLayouts 때 아무 이유없이 텍스트가 세로 및 가로로 가운데에있는 경우에만 작동하는 FrameLayout을 제거합니다. Outside the FrameLayouts

+0

을 내가 그 큰 이미지 미안 해요, 아무 생각 그것은 보이게하는 translationZ입니다 나중에 내가 애니메이션을 해요 때문에 나는, 레이아웃을 사용할 필요가 – RouNdeL

답변

0

최종 레이아웃 인 경우 FrameLayout이 필요하지 않습니다. textView에서 직접 배경색을 설정할 수 있습니다. 가능한 한 적은 레이아웃 수준으로 사용해보십시오.

텍스트 정렬의 경우 textView 스텁에 "Wrap_content"값이 있기 때문입니다.

이 시도 :

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout android:layout_height="match_parent" 
    android:layout_width="match_parent" 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:gravity="bottom"> 
    <com.roundel.calc2.CalcPadLayout 
     android:paddingBottom="@dimen/activity_vertical_margin" 
     android:paddingTop="@dimen/activity_vertical_margin" 
     android:paddingRight="@dimen/activity_horizontal_margin" 
     android:paddingLeft="@dimen/activity_horizontal_margin" 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_height="wrap_content" 
     android:layout_width="wrap_content" 
     android:rowCount="1" 
     android:columnCount="2" 
     android:background="@color/greyDark" 
     android:gravity="bottom"> 
     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="match_parent" 
      android:text="New Text" 
      android:id="@+id/textView" 
      android:gravity="center" 
      android:textColor="@color/white" 
      android:background="@color/colorPrimary" 
      android:textSize="35sp"/> 
     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="match_parent" 
      android:text="New Text" 
      android:id="@+id/textView2" 
      android:gravity="center" 
      android:background="@color/colorPrimaryDark" 
      android:textColor="@color/white" 
      android:textSize="35sp"/> 
    </com.roundel.calc2.CalcPadLayout> 
</LinearLayout> 
+0

을 그들에게 작은하지 않습니다하는 방법 마치 "표면에서 떠오르는"것처럼 – RouNdeL

+0

어쨌든, 레이아웃을 사용하지 않아도 텍스트가 중앙에 있지 않으면 다른 문제입니다. – RouNdeL

관련 문제