Android中TextView居中顯示無效的原因和解決方案。
阿新 • • 發佈:2018-12-09
今天在寫程式碼的時候,出現一個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().注:寫部落格時特意將其註釋掉進行還原。
問題解決,開心!提醒自己以後小心點。