今天在写代码的时候,出现一个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().注:写博客时特意将其注释掉进行还原。
问题解决,开心!提醒自己以后小心点。