Android开发在代码中设置线性布局LinearLayout和相对布局RelativeLayout的各种属性

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;

来设置对话框内容布局相对于父布局左对齐。

你可能感兴趣的:(Android,java,Layout)