Android入门系列(二):布局管理器和基本组件

Android入门系列(二):布局管理器和基本组件,第1张

Android入门系列(二):布局管理器和基本组件 一、布局管理器 1.线性布局LinearLayout

线性布局的每一列只能放置一个组件,且组件超出了屏幕内容不会换行

可设定的属性

orientation:布局内元素的排列方式,horizontal横排(默认),vertical竖排

gravity:布局内元素的位置,可以使用 | 连接,有top,bottom,left,right属性

layout_width和layout_height:布局的宽度和高度,有match_parent=fill_parent最大,wrap_content布局内元素的最大

id:唯一标识

background:背景颜色,可以使用@来引用,也可以直接使用十六进制

2.表格布局TableLayout

表格布局继承了线性布局

先看代码和效果




    
        
        

        
        
        
        
    
    
        
        

        
        
        
        
    
    
        
        
        
        
    


具体说下里面的属性

在TableLayout的大标签下面,每一个TableRow代表一行,gravity表示为内部这几个row的位置

stretchColumns表示需要在哪些位置伸展为空的内容,这里写的0、3,即为数组的1和4的位置为空,即红框这一部分

测试之后发现其实使用gravity=center的属性可以替代拉伸

EditText里可以用inputType属性来更改输入的文本类型

3.帧布局管理器frameLayout

帧布局就是指将屏幕分为一个个空白的区域,每一个区域为一帧,默认从左上角开始,且后面的组件会覆盖掉之前的组件

foreground设置前景图像的属性,foregroundGravity前景图像的位置




    
    
    


其中layout_gravity表示的是容器本身位于父容器的位置,可用 | 连接

效果如下

4.相对布局RelativeLayout

基本属性:

​ gravity设置容器内组件的对齐方式,

​ ignoreGravity设置该属性为true的组件不受gravity属性的影响

根据父容器定位:

​ layout_alignParentLeft的属性为true表示左对齐父容器,还有Right,Top,Bottom,

​ android:layout_centerHorizontal为true表示在父容器中水平居中,还有Vertical垂直居中,以及InParent居中

根据兄弟容器定位:

​ layout_toLeftOf设定id属性即放在这个id对象的左边,同类型的还有layout_toRightOf,layout_above,layout_below,效果如下

​ layout_alignLeft即和该参考组件的左边界对其,同类型还有layout_alignBottom,layout_alignLeft,layout_alignRight,效果如下

​ margin设置偏移量,指和父容器的偏移量,有layout_marginLeft/Right/Top/Bottom,也可以设置layout_margin来同时控制四个偏移量

​ padding设置填充,主要设置组件内元素的填充亮,比如TextView中文字的具体位置,paddingLeft/Right/Top/Bottom以及android:padding同时设置四个位置

二、基本组件 1.文本框与编辑框TextView EditView

EditView是TextView的子类,所以拥有它的所有方法




    
    
    



需要注意的是输入类型和是否单行输入

2.按钮Button

最主要的就是onClick方法,可以同各国两种方式实现,一种是在onCreate中设置setonClickListener(new View.onClickListener()来实现,另一种是在xml里写onclick属性,在Activity类中直接写该方法,下面实现了一下登陆验证的 *** 作

xml如下




    
        
        
        
        
    
    
        
        
        
        
    
    
        
        
        
        
    
    
        
        
        
    
    
        
        

java代码如下

package com.thundersoft.test;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.Nullable;

import com.thundersoft.myapplication.R;

public class ButtonActivity extends Activity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.button);
        EditText user = findViewById(R.id.user);
        EditText pwd = findViewById(R.id.pwd);
        EditText pwdc = findViewById(R.id.pwdc);
        TextView info = findViewById(R.id.info);
        String pwds = pwd.getText().toString();
        String pwdcs = pwdc.getText().toString();
        Button reg = findViewById(R.id.reg);
        Button re = findViewById(R.id.re);
        re.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                info.setText("");
                user.setText("");
                pwd.setText("");
                pwdc.setText("");
            }
        });
        reg.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
//                pwds.equals(pwdcs)==false竟然判断不出来
                if (!pwds.equals(pwdcs)){
                    info.setText("密码不一致");
                }
                else {
                    Toast t = Toast.makeText(ButtonActivity.this, "注册成功", Toast.LENGTH_SHORT);
                    t.show();
                }
            }
        });
    }
}
3.单选按钮RaidoButton

RaidoButton需要在RadioGroup中使用



    
        
        
    
    

java代码如下

package com.thundersoft.test;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.Toast;

import androidx.annotation.Nullable;

import com.thundersoft.myapplication.R;

public class RadioActivity extends Activity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.radiobutton);

        RadioGroup group = findViewById(R.id.group);
        group.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(RadioGroup group, int checkedId) {
                RadioButton button = findViewById(checkedId);
                Toast toast = Toast.makeText(RadioActivity.this, button.getText() + "被点击", Toast.LENGTH_SHORT);
                toast.show();
            }
        });
        Button submit = findViewById(R.id.submit);
        submit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                for (int i = 0; i < group.getChildCount(); i++) {
                    RadioButton childAt = (RadioButton) group.getChildAt(i);
                    if (childAt.isChecked()){
                        Toast toast = Toast.makeText(RadioActivity.this, childAt.getText() + "确定", Toast.LENGTH_SHORT);
                        toast.show();
                    }
                }
            }
        });
    }
}

java中,通过找到组的id,通过组的getChildCount方法,通过循环,对radio的下标进行选定

4.复选框CheckBox



因为checkbox的监听因素,需要创建一个单独的监听器对象,传入多个监听器中

private CompoundButton.OnCheckedChangeListener listener = new CompoundButton.OnCheckedChangeListener(){
    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        if (isChecked){
            Toast toast = Toast.makeText(RadioActivity.this, "选中了"+buttonView.getText().toString(), Toast.LENGTH_SHORT);
            toast.show();
        }
    }
};
CheckBox c1 = findViewById(R.id.c1);
CheckBox c2 = findViewById(R.id.c2);
CheckBox c3 = findViewById(R.id.c3);
c1.setOnCheckedChangeListener(listener);
c2.setOnCheckedChangeListener(listener);
c3.setOnCheckedChangeListener(listener);

这样可以简化代码

点击获取如下

Button button = findViewById(R.id.submit1);
button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        String answer = "";
        if(c1.isChecked())
            answer += c1.getText().toString() + " ";
        if(c2.isChecked())
            answer += c2.getText().toString() + " ";
        if(c3.isChecked())
            answer += c3.getText().toString() + " ";
        Toast toast = Toast.makeText(RadioActivity.this, "选中"+answer, Toast.LENGTH_SHORT);
        toast.show();
    }
});
5.图像视图ImageView

图象视图有几个重要的属性

android:adjustViewBounds用于设置ImageView是否调整自己的边界来保持所显示图片的宽高比,也就是以图片为主

android:maxHeight/Width需要设置上一个属性为true才能指定最大值

android:scaleType属性有以下显示

​ matrix以matrix的方式缩放

​ fitXY以ImageView的尺寸为主

​ fitStar/fitCenter/fitEnd保持图片纵横比,知道图片能完全显示

​ center/centerCrop/centerInside放在正中间/保持纵横比并完全覆盖/保持纵横比并完全显示

tint染色

6.列表选择框spinner

在xml中新建spinner标签

可以指定strings中的内容放入spinner中


    学生
    老师
    保安
    食堂阿姨
    领导


java代码如下

package com.thundersoft.test;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Spinner;
import android.widget.Toast;

import androidx.annotation.Nullable;

import com.thundersoft.myapplication.R;

public class SpinnerActivity extends Activity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.spinner);
        Spinner spinner = findViewById(R.id.spinner);
        spinner.getSelectedItem();
        spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView parent, View view, int position, long id) {
                String s = parent.getItemAtPosition(position).toString();
                Toast.makeText(SpinnerActivity.this,s,Toast.LENGTH_SHORT).show();
            }
            @Override
            public void onNothingSelected(AdapterView parent) {

            }
        });
    }
}

java通过选择监听器来监听选择的元素

parent.getItemAtPosition(position).toString();

很多情况下不能从strings中获得内容,我们需要把获取到的内容放在java中存储

通过适配器来实现功能,使用方法如下

package com.thundersoft.test;

import android.app.Activity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.LinearLayout;
import android.widget.Spinner;

import androidx.annotation.Nullable;

import com.thundersoft.myapplication.R;

public class Spinner2Activity extends Activity {
    String[] strings = new String[]{"学生","老师","领导"};
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        LinearLayout linearLayout = new LinearLayout(Spinner2Activity.this);
        setContentView(linearLayout);
        Spinner spinner = new Spinner(Spinner2Activity.this);
        ArrayAdapter objectArrayAdapter = new ArrayAdapter(this, android.R.layout.simple_spinner_item,strings);
        objectArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner.setAdapter(objectArrayAdapter);
        linearLayout.addView(spinner);
    }
}
7.列表视图ListView

最简单的实现方式就是使用ListView标签,接着设置entity属性为@strings里的内容,如下图所示




    


divider是分割条,可以使用颜色和图片

dividerHeight分割条的高度

entries之间见过,就是使用strings中的array来指定list

footerDividersEnabled/header是底部和头部的绘制,需要通过java代码控制

但是这样的并不常用,很多情况下需要从其他地方获取ListView,而且这些内容必须在java代码中管理

下面是使用适配器加xml布局文件生成的listview

package com.thundersoft.test;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.Toast;

import androidx.annotation.Nullable;

import com.thundersoft.myapplication.R;

public class ListviewActivity extends Activity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
//        布局
        super.onCreate(savedInstanceState);
        LinearLayout linearLayout = new LinearLayout(ListviewActivity.this);
        setContentView(linearLayout);
//        listview
        ListView listView = new ListView(ListviewActivity.this);
//        配置分割线
        View line = View.inflate(ListviewActivity.this, R.layout.linearlayout, null);
//        设置头部线
        listView.addHeaderView(line);
//        创建适配器
        ArrayAdapter ad = ArrayAdapter.createFromResource(this, R.array.listview, android.R.layout.simple_list_item_checked);
        listView.setAdapter(ad);
        listView.addFooterView(line);
//        放进去
        linearLayout.addView(listView);
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView parent, View view, int position, long id) {
                String s = parent.getItemAtPosition(position).toString();
                Toast.makeText(ListviewActivity.this,s,Toast.LENGTH_SHORT).show();
            }
        });
    }
}

View.inflate(ListviewActivity.this, R.layout.linearlayout, null);表示的是从其他位置获取的内容

我们也可以自定义列表中的内容,这时候就需要继承ListActivity了,代码如下

package com.thundersoft.test;

import android.app.ListActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import androidx.annotation.Nullable;

public class Listview2Activity extends ListActivity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        String[] strings = new String[]{"测试1", "测试2", "测试3"};
        ArrayAdapter ad = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, strings);
        this.setListAdapter(ad);
    }

    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        super.onListItemClick(l, v, position, id);
        String s = l.getItemAtPosition(position).toString();
        System.out.println(s);
    }
}

该方法相对简单,直接通过this.setListAdapter(ad);配置适配器即可

另外要着重说明一下适配器之一的SimpleAdapter,它的代码如下

package com.thundersoft.test;

import android.app.ListActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;

import androidx.annotation.Nullable;

import com.thundersoft.myapplication.R;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.ListIterator;
import java.util.Map;

public class Listview3Activity extends ListActivity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        int[] ints = {R.drawable.code, R.drawable.pic, R.drawable.fav};
        String[] strings = new String[]{"代码专区", "图片预览", "我的喜爱"};
        List> item = new ArrayList<>();
        for (int i = 0; i < strings.length; i++) {
            HashMap map = new HashMap<>();
            map.put("image",ints[i]);
            map.put("title",strings[i]);
            item.add(map);
        }
        SimpleAdapter ad = new SimpleAdapter(this, item, R.layout.item, new String[]{"title", "image"}, new int[]{R.id.item_title, R.id.item_image});
        this.setListAdapter(ad);

    }
}

SimpleAdapter的源码如下

public SimpleAdapter(Context context, List> data,
     @LayoutRes int resource, String[] from, @IdRes int[] to)

context表示指定关联该Adapter运行的上下文,这里是this

data指定一个基于Map的列表List,代表每一行

resource表示要放的布局文件,这里的item是一个LinearLayout中包含一个Image和Text的布局

from表示唯一指定表示名字,这里的title和image和map中的k键对应

to表示为放在布局文件上的哪个位置,item_title和item_image是id

这里需要新建一个item的xml文件



    
    


8.日期时间选取器DatePicker TimePicker

xml如下



    
        
        
    

java代码如下

package com.thundersoft.test;

import android.app.Activity;
import android.os.Bundle;
import android.widget.DatePicker;
import android.widget.TimePicker;

import androidx.annotation.Nullable;

import com.thundersoft.myapplication.R;

import java.util.Calendar;

public class PickerActivity extends Activity {

    int year;
    int month;
    int day;
    int hour;
    int minute;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.picker);
        DatePicker datePicker = findViewById(R.id.date);
        TimePicker timePicker = findViewById(R.id.time);
        timePicker.setIs24HourView(true);
        Calendar instance = Calendar.getInstance();
        year = instance.get(Calendar.YEAR);
        month = instance.get(Calendar.MONTH);
        day = instance.get(Calendar.DAY_OF_MONTH);
        hour = instance.get(Calendar.HOUR_OF_DAY);
        minute = instance.get(Calendar.MINUTE);
        datePicker.init(year, month, day, new DatePicker.OnDateChangedListener() {
            @Override
            public void onDateChanged(DatePicker view, int year, int month, int day) {
                PickerActivity.this.year=year;
                PickerActivity.this.month=month;
                PickerActivity.this.day=day;
                System.out.println(year+month+day+hour+minute);
            }
        });
        timePicker.setOnTimeChangedListener(new TimePicker.OnTimeChangedListener() {
            @Override
            public void onTimeChanged(TimePicker view, int hour, int minute) {
                PickerActivity.this.hour = hour;
                PickerActivity.this.month = minute;
                System.out.println(hour+minute);
            }
        });
    }
}

需要注意的是日历对象的使用

9.计时器Chronometer


    
    

java代码如下

package com.thundersoft.test;

import android.app.Activity;
import android.os.Bundle;
import android.os.SystemClock;
import android.view.View;
import android.widget.Button;
import android.widget.Chronometer;

import androidx.annotation.Nullable;

import com.thundersoft.myapplication.R;

public class ChronometerActivity extends Activity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.chronometer);
        Chronometer chronometer = findViewById(R.id.chro);
//        设置起始时间
        chronometer.setbase(SystemClock.elapsedRealtime());
//        设置格式
        chronometer.setFormat("已用时间:%s");
        Button start = findViewById(R.id.startbutton);
        Button end = findViewById(R.id.endbutton);
        Button for0 = findViewById(R.id.for0);
        start.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                chronometer.start();
            }
        });
        end.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                chronometer.stop();
            }
        });
        for0.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                chronometer.setbase(SystemClock.elapsedRealtime());
            }
        });

    }
}

1.先设置初始时间

2.再设置格式

3.开始计时器

4.结束计时器

4.设置监听器(可省略)setOnChronometerTickListener

三、实践 1.要求

实现一个登录页面,提供记住密码和用户名功能,登陆后显示列表视图必须包含登录用户名,且点击列表会显示点击那一项

2.代码实现

login.xml




    
        
        
        
        
    
    
        
        
        
        
    
    
        
        
        
    
    
        
        

item.xml




    
    
    

LoginActivity.java

package com.thundersoft.session1;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Toast;
import android.content.SharedPreferences.Editor;

import androidx.annotation.Nullable;

import javax.security.auth.login.LoginException;

public class LoginActivity extends Activity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.login);

        //先定义
        SharedPreferences sp = null;

        EditText user = findViewById(R.id.user);
        EditText pwd = findViewById(R.id.pwd);
        Button login = findViewById(R.id.login);
        Button re = findViewById(R.id.re);
        CheckBox remember = findViewById(R.id.remember);

        sp = this.getSharedPreferences("userinfo", Context.MODE_PRIVATE);
        if (sp.getBoolean("checkboxBoolean", false))
        {
            user.setText(sp.getString("user", null));
            pwd.setText(sp.getString("pwd", null));
            remember.setChecked(true);
        }
        SharedPreferences finalSp = sp;
        login.setOnClickListener(new View.OnClickListener() {
            //            执行登录
            @Override
            public void onClick(View v) {
                System.out.println(user.getText().toString());
                //        判断是否输入了名字和密码
                if(user.getText().toString().trim().equals("")){
                    Toast.makeText(LoginActivity.this, "请您输入用户名!", Toast.LENGTH_SHORT).show();
                    return;
                }
                if(pwd.getText().toString().trim().equals("")){
                    Toast.makeText(LoginActivity.this, "请您输入密码!", Toast.LENGTH_SHORT).show();
                    return;
                }
//                记住我判断
                Editor editor = finalSp.edit();
                if (remember.isChecked())
                {
                    editor.putString("user", user.getText().toString());
                    editor.putString("pwd", pwd.getText().toString());
                    editor.putBoolean("checkboxBoolean", true);
                }
                else
                {
                    editor.putString("user", null);
                    editor.putString("pwd", null);
                    editor.putBoolean("checkboxBoolean", false);
                }
                editor.commit();
                //Intent跳转
                Intent intent=new Intent(LoginActivity.this,MainActivity.class);
                intent.putExtra("name", user.getText().toString());
                startActivity(intent);
                finish();

            }
        });
    }
}

MainActivity.java

package com.thundersoft.session1;

import android.app.ListActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;

import androidx.annotation.Nullable;

import com.thundersoft.session1.R;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.ListIterator;
import java.util.Map;

public class MainActivity extends ListActivity {



    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

//        拿到数据
        Intent intent = getIntent();
        String name = intent.getStringExtra("name");

//        数据存放
        int[] num = new int[]{1,2,3,4,5};
        String[] names = new String[]{name,name,name,name,name};
        List> item = new ArrayList<>();
        for (int i = 0; i < names.length; i++) {
            HashMap map = new HashMap<>();
            map.put("num",num[i]);
            map.put("name",names[i]);
            item.add(map);
        }
        SimpleAdapter ad = new SimpleAdapter(
                this,
                item,
                R.layout.item,
                new String[]{"num", "name"},
                new int[]{R.id.item_num, R.id.item_user});
        this.setListAdapter(ad);
    }

    //        点击事件
    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        super.onListItemClick(l, v, position, id);
        int index = position+1;
//        String s = l.getItemAtPosition(position).toString();
        Toast.makeText(this,"您选择了第"+ index +"项",Toast.LENGTH_SHORT).show();
    }
}
3.实现效果

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5573701.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-14
下一篇 2022-12-14

发表评论

登录后才能评论

评论列表(0条)

保存