【问题标题】:TextView not displaying while in a FrameLayoutTextView 在 FrameLayout 中不显示
【发布时间】:2016-08-25 15:13:45
【问题描述】:

我编写了一个自定义 GroupView 类,它在 X 到 Y 网格中显示它的子项。孩子们是正方形。

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。让我们在两个 FrameLayout 中显示两个 TextView,我将设置 FrameLayout 的背景颜色,以便查看它们是否正确显示:

<?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>

布局正常显示,但 TextView 不可见 当我删除 FrameLayout 时,它可以工作,但是无缘无故地文本只是垂直居中而不是水平居中。

【问题讨论】:

  • 我很抱歉那些巨大的图像,不知道如何让它们变小

标签: android textview android-framelayout


【解决方案1】:

如果这是您的最终布局,则不需要 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>

【讨论】:

  • 我需要使用 Layout,因为稍后我会为它的 translationZ 设置动画,让它看起来好像是“从表面升起”
  • 无论如何,即使我不使用布局文本不居中,这是另一个问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多