Android中TextView居中显示无效的原因和解决方案。

版权声明:出于感谢(如果有收获)或对知识的尊重,未经允许禁止转载 https://blog.csdn.net/bendan50/article/details/82630895

今天在写代码的时候,出现一个Bug,最后解决了,现在记录下。

自定义了一个布局控件,用于PopupWindow提示邮箱类型,结果显示的邮箱类型无法居中,刚开始的效果如图所示:

上面所贴图片没有经过处理,其中“@126.com”的文字在白色背景中没有居中。注:白色背景为TextView的背景色。下面贴下当前实现的代码:

package com.migu.crsh.test.all.crshtestapplication.javalayout;

import android.content.Context;
import android.graphics.Color;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;


/**
 * Created by crsh on 2018/9/10.
 * com.cmcc.migusso.sdk.widget
 * com.cmcc.migusso.sdk.widget
 */

public class MailItemListView extends RelativeLayout{
    private Context mContext;
    private TextView mTextView;
    private ImageView mImageView;
    public MailItemListView(Context context) {
        super(context);
        mContext = context;
        initView();
    }

    public MailItemListView(Context context, AttributeSet attrs) {
        super(context, attrs);
        mContext = context;
        initView();
    }

    private void initView() {

        this.setBackgroundColor(Color.GREEN);
        this.setGravity(CENTER_VERTICAL);

        mTextView = new TextView(mContext);
//        mTextView.setGravity(Gravity.CENTER_VERTICAL);
        mTextView.setGravity(CENTER_VERTICAL);
        mTextView.setTextSize(14);
        mTextView.setTextColor(Color.RED);
        mTextView.setText("@126.com");
        mTextView.setBackgroundColor(Color.WHITE);
        LayoutParams tvParams = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, 88);
        tvParams.leftMargin = 20;
        tvParams.rightMargin = 40;
//        tvParams.addRule(RelativeLayout.CENTER_VERTICAL);
        tvParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
        this.addView(mTextView,tvParams);

        mImageView = new ImageView(mContext);
//        mImageView.setImageDrawable(getResources().getDrawable(ResourceUtil.getDrawableId(mContext,"clear_edt")));
        mImageView.setBackgroundColor(Color.RED);
        LayoutParams ivParams = new LayoutParams(40,40);
        ivParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
        ivParams.rightMargin = 20;
        ivParams.addRule(RelativeLayout.CENTER_VERTICAL);
        this.addView(mImageView,ivParams);

    }


    //---------------------下面是get() set()方法------------------//

    public TextView getmTextView() {
        return mTextView;
    }

    public ImageView getmImageView() {
        return mImageView;
    }

    public void setmTextView(TextView mTextView) {
        this.mTextView = mTextView;
    }

    public void setmImageView(ImageView mImageView) {
        this.mImageView = mImageView;
    }
}

其中比较关键的就几行,重复贴下:

this.setBackgroundColor(Color.GREEN);
        this.setGravity(CENTER_VERTICAL);

        mTextView = new TextView(mContext);
//        mTextView.setGravity(Gravity.CENTER_VERTICAL);
        mTextView.setGravity(CENTER_VERTICAL);
        mTextView.setTextSize(14);
        mTextView.setTextColor(Color.RED);
        mTextView.setText("@126.com");
        mTextView.setBackgroundColor(Color.WHITE);
        LayoutParams tvParams = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, 88);
        tvParams.leftMargin = 20;
        tvParams.rightMargin = 40;
//        tvParams.addRule(RelativeLayout.CENTER_VERTICAL);
        tvParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
        this.addView(mTextView,tvParams);

正如代码中所写的那样,我已经setGravity(CENTER_VERTICAL); 理应居中显示啊。这是为什么呢?

跟踪进代码看下其值,就会发现问题所在。

试试我上面代码中所注释的那句:setGravity(Gravity.CENTER_VERTICAL);其代码值又是多少呢?见下图:

经过计算,其值为16.

所以如果想让TextView居中应该设置其值为16,即:setGravity(16); 而前面的代码,是设置setGravity(15),这就是问题所在。

为什么会变成这样呢?因为自定义布局控件中,其父类为RelativeLayout,所以引用时直接引用父类的变量,而不是Gravity类中的变量。

解决方案就是采用注释掉的那句setGravity().注:写博客时特意将其注释掉进行还原。

问题解决,开心!提醒自己以后小心点。

猜你喜欢

转载自blog.csdn.net/bendan50/article/details/82630895