1,第一种情况是我完全不定义xml布局文件,布局文件完全是在Java文件中写出来,代码如下:
import android.annotation.SuppressLint;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.ViewGroup.LayoutParams;
import android.widget.RelativeLayout;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
@SuppressLint("ResourceType")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//所有控件的父布局
RelativeLayout relativeLayout=new RelativeLayout(this);
//设置父布局的宽度和高度
relativeLayout.setLayoutParams(new RelativeLayout
.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
//new出自己要添加的控件
TextView textView1=new TextView(this);
//设置其id,字体和颜色
textView1.setId(1);
textView1.setTextColor(Color.BLACK);
textView1.setTextSize(20);
textView1.setText("这是 new 出的第一个textView1");
//设置TextView1的宽度和高度
RelativeLayout.LayoutParams layoutParams=new RelativeLayout
.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
//设置textView1相对于父布局左对齐,如果是LinearLayout设置布局参数,比如是相对于父布局左对齐
//则使用layoutParas.gravity=Gravity.LEFT,layoutParas.setGravity(Gravity.XXX)这个属性
// 主要是设置线性布局里面空间内容的位置;
layoutParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
//把textView1的布局属性设置进去
textView1.setLayoutParams(layoutParams);
//把textView1这个空间添加到父布局
relativeLayout.addView(textView1, layoutParams);
//new出自己想要的控件
TextView textView2=new TextView(this);
//设置其id
textView2.setId(2);
textView2.setTextColor(Color.RED);
textView2.setTextSize(18);
textView2.setText("这是new出的第二个textView2");
//设置TextView的宽度,高度
RelativeLayout.LayoutParams layoutParams2=new RelativeLayout
.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
layoutParams2.topMargin=150;
layoutParams2.leftMargin=100;
//用于设置位置
layoutParams2.addRule(RelativeLayout.BELOW, 1);//设置相对于某个控件的位置
layoutParams2.addRule(RelativeLayout.CENTER_HORIZONTAL);//在父中的位置
relativeLayout.addView(textView2, layoutParams2);
setContentView(relativeLayout);
}
}
2,如果是已经有父布局,只想要设置父布局里面控件的相应参数,假如我自定义了一个对话框,对话框的内容是列表形式,我自定义了列表item的布局,如下:
然后定义一个DialogListItem类,继承自RelativeLayout:
public class DialogListItem extends RelativeLayout {
/**显示的星号**/
private TextView star;
/**显示的文案**/
private TextView content;
public DialogListItem(Context context) {
this(context, null);
}
public DialogListItem(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public DialogListItem(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initViews(context);
}
private void initViews(Context context) {
LayoutInflater.from(context).inflate(R.layout.dialog_list_item, this);
star = (TextView) findViewById(R.id.star);
content = (TextView) findViewById(R.id.content);
}
public void setContent(String content) {
this.content.setText(content);
}
public void setSpannedContent(Spanned content) {
this.content.setText(content);
}
public void setStarInvisible() {
star.setVisibility(INVISIBLE);
}
}
最后我开始定义myDialog继承Dialog,在MyDialog的xml布局文件中设置对话框内容可以使列表,也可以不是列表,但是标题和确定取消按钮是要居中显示的,这就导致对话框内容也要居中显示,如下代码,父布局设置了 android:gravity="center_horizontal"这个属性,导致LinearLayout布局里面的所有控件都要居中显示:
那我们应该怎么更改这个不居中单个控件的布局参数呢?
那么我们就应该在MyDialog对话框中这样做:
/**
这个函数主要是用来设置对话框中的标题,内容,确定取消等内容,至于显示对话框就要使用show这个方法
* @param dialogIconResId 传-1表示需要隐藏此项
* @param dialogTitleTxt 传 null表示需要隐藏此项
* @param dialogContentList 传 null表示需要隐藏此项
* @param dialogBtnOneTxt 传null表示不显示此项
* @param dialogBtnTwoTxt 不能为null
* @return
*/
public CommonDialog set(List dialogContentList, int dialogIconResId, String dialogTitleTxt, String dialogBtnOneTxt, String dialogBtnTwoTxt) {
if (dialogIconResId < 0) {
dialogIcon.setVisibility(View.GONE);
} else {
dialogIcon.setVisibility(View.VISIBLE);
dialogIcon.setImageResource(dialogIconResId);
}
if (dialogTitleTxt == null) {
dialogTitle.setVisibility(View.GONE);
} else {
dialogTitle.setVisibility(View.VISIBLE);
dialogTitle.setText(dialogTitleTxt);
}
dialogContent.setVisibility(View.GONE);
//当内容列表为空时,不显示列表样式
if (dialogContentList == null || dialogContentList.size() == 0) {
dialogContentListLayout.setVisibility(View.GONE);
//当内容列表长度为1时,以普通内容形式展示
} else if (dialogContentList.size() == 1) {
dialogContentListLayout.setVisibility(View.GONE);
dialogContent.setVisibility(View.VISIBLE);
dialogContent.setText(dialogContentList.get(0));
} else {
dialogContentListLayout.setVisibility(View.VISIBLE);
dialogContentListLayout.removeAllViews();
for (int i = 0; i < dialogContentList.size(); i++) {
addListItem(dialogContentListLayout, dialogContentList.get(i));
}
}
if (TextUtil.isEmpty(dialogBtnOneTxt)) {
dialogBtnOne.setVisibility(View.GONE);
} else {
dialogBtnOne.setVisibility(View.VISIBLE);
dialogBtnOne.setText(dialogBtnOneTxt);
}
dialogBtnTwo.setText(dialogBtnTwoTxt);
return this;
}
其中addListItem这个函数,是本次讲解的重点,关注一下:
private void addListItem(LinearLayout parent, String item) {
DialogListItem itemView = new DialogListItem(mContext);
//RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
//lp.topMargin = ResourcesUtil.getDimensionPixelSize(R.dimen.dialog_list_item_margin);
//设置对话框列表内容靠左对齐,居上面10dp
LinearLayout.LayoutParams lp=new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT);
lp.gravity=Gravity.LEFT;
lp.topMargin=ResourcesUtil.getDimensionPixelSize(R.dimen.dialog_list_item_margin);
itemView.setContent(item);
//itemView.setLayoutParams(lp);
parent.setLayoutParams(lp);
// itemView.setPadding(60, 0, 86, 30);
parent.addView(itemView);
}
这里就用到了LinearLayout.LayoutParams lp=new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT);
lp.gravity=Gravity.LEFT;
来设置对话框内容布局相对于父布局左对齐。