1. 程式人生 > >Android中TextView居中顯示無效的原因和解決方案。

Android中TextView居中顯示無效的原因和解決方案。

今天在寫程式碼的時候,出現一個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().注:寫部落格時特意將其註釋掉進行還原。

問題解決,開心!提醒自己以後小心點。