# 界面布局

提示

在 Android 中,不允许线程更新程序界面,需要使用 Handler对象来更新 UI,充当子线程和 UI 主线程的信使

# 标题栏

显示标题栏:

ActionBar actionBar = getActionBar();
actionBar.show();

隐藏标题栏:

ActionBar actionBar = getActionBar();
actionBar.hide();

# 包含 XML 布局

<include layout="@layout/XML名称"></include>

# 按钮 Button

<Button
  android:id="@+id/按钮ID"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:text="按钮标题"
/>

绑定按钮事件:

Button Button1 = (Button)findViewById(R.id.按钮ID);
Button1.setOnClickListener(new OnClickListener() {
   public void onClick(View arg0) {

   }
});

# 图片按钮 ImageButton

<ImageButton
  android:id="@+id/按钮ID"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:src="@mipmap/图片路径"
  android:background="#0000"
/>

提示

可使用 `android:background="#0000"` 将背景设置透明

# 文本框 TextView

<TextView
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:text="@string/字符串名称"
/>

\src\res\values\strings.xml

<resource>
  <string name="字符串名称">文本框内容</string>
</resource>

TextView 常用属性:

  • 字体大小: `android:` textSize="字体大小(单位 sp)"
  • 字体颜色: `android:textColor="#十六进制颜色值"`
  • 背景: `android:background="背景图片路径/#十六进制颜色值"`
  • 设置单行: `android:singleLine="true"`

# 编辑框 EditText

<EditText
  android:id="@+id/编辑框ID"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:hint="提示内容"
/>

TextView 常用属性:

  • 编辑框类型: `android:` inputType="编辑框类型"
  • 设置编辑框行数: `android:lines="行数"`
  • 在上侧显示图标: `android:` drawableTop="@mipmap\图标路径"
  • 在下侧显示图标: `android:` drawableBottom="@mipmap\图标路径"
  • 在左侧显示图标: `android:` drawableLeft="@mipmap\图标路径"
  • 在右侧显示图标: `android:` drawableRight="@mipmap\图标路径"

# 单选按钮 RadioButton

<RadioGroup
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  <RadioButton
  android:id="@+id/单选按钮ID"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:text="单选按钮内容"
  android:checked="true"
  />
</RadioGroup>

获取选择状态: `单选按钮.isCgecked()`

# 多选框 CheckBox

<CheckBox
  android:id="@+id/多选框ID"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:hint="多选框内容"
  android:checked="true"
/>

获取选择状态: `单选按钮.isCgecked()`

# 图片框 ImageView

<ImageView
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:src="@drawable/图片名称(无扩展名)"
/>

提示

  • 可使用 `android:scaleType` 属性设置缩放模式
  • 可使用 `android:adjustViewBounds="true"` 属性设置取消等比例缩放
  • 可使用 `android:maxWidth="100dp"` 属性设置最大宽度
  • 可使用 `android:maxHeight="100dp"` 属性设置最大高度

# 图片切换器 ImageSwitcher

<ImageSwitcher
  android:id="@+id/图像切换器ID"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:src="@drawable/图片名称(无扩展名)"
/>
private int[] 图片数组 = new int[R.drawable.图片名1,R.drawable.图片名2]

ImageSwitcher 图像切换器 = (ImageSwitcher)findViewById(R.id.图像切换器ID);
//设置淡入动画
图像切换器.setInAnimation (AnimationUtils.loadAnimation(MainActivity.this,android.R.anim.fade_in));
//设置淡出动画
图像切换器.setOutAnimation (AnimationUtils.loadAnimation(MainActivity.this,android.R.anim.fade_out));
图像切换器.setFactory (new ViewSwitcher.ViewFactory() {
  @Override
  public View makeView() {
    ImageView imageView = new ImageView (MainActivity.this);
    imageView.setImageResource(图片数组[0]) ;
    return imageView;
});

# 日期选择器 DatePicker

<DatePicker
  android:id="@+id/日期选择器ID"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
/>

# 时间选择器 TimePicker

<TimePicker
  android:id="@+id/时间选择器ID"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
/>
TimePicker TimePicker1= (TimePicker) findViewById(R.id.时间选择器ID);
//设置24小时制
TimePicker1.setIs24HourView(true);
TimePicker1.setOnTimeChangedListener (new TimePicker.OnTimeChangedListener(){
  @Override
  public void onTimeChanged (TimePicker view,int hour0fDay, int minute) {
    String time = hour0fDay+ "时"+minute+"分";
    //显示当前选择时间
    Toast.makeText(MainActivity.this,time,Toast.LENGTH_SHORT).show();
});

# 计时器 Chronometer

<Chronometer
  android:id="@+id/计时器ID"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
/>
Chronometer Chronometer1 = (Chronometer)findViewById(R.id.计时器D);
Chronometer1.setBase(SystemClock.elapsedRealtime());
Chronometer1.setFormat("%s");
Chronometer1.start();
Chronometer1.setOnChronometerTickListener (new Chronometer.OnChronometerTickListener() {
  @Override
  public void onChr onometer Tick (Chr onometer chr onometer) {

  }
}

# 进度条 ProgressBar

<ProgressBar
  android:id="@+id/进度条ID"
  style="?android:attr/progressBarStyleHorizontal"
  android:max="100"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
/>

提示

  • 可使用 `style` 属性设置进度条样式(默认旋转圆圈)
  • 可使用 `进度条.setProgress` 方法设置当前进度
private int mProgress = 0;
private Handler Handler1;
@0verride
protected void onCreate (Bundle savedInstanceState) {
  super.onCreate (savedInstanceState);
  setContentView(R.layout.activity_main);
  progressBar = (ProgressBar)findViewById(进度条ID);
  Handler1 = new Handler () {
    @Override
    public void handleMessage (Message msg) {
      if(msg.what == 0x111){
        progressBar.setProgress(mProgress);
        }else{
          Toast.makeText(MainActivity.this,"耗时操作已完成",Toast.LENGTH_SHORT).show();
          progressBar.setVisibility (View.GONE);
      }

    }
};
new Thread (new Runnab1p() {
  @0verride
  public void run() {
    while(true){
      mProgress = doWork();
      Message m = new Message ();
      if (mProgress<100) {
        m.what=0x111;
        Handler1.sendMessage(m);
        }else{
          m.what = 0x110;
          Handler1.sendMessage(m);
          break;
        }
    }
  }
  private int doWork(){
    mProgress = mProgress + Math.random() * 10;
    try{
      Thread.sleep(200);
    } catch(InterruptedException e){
      e.printStackTrace();
    }
    return mProgress;
  }
}).start();

# 拖动条 SeekBar

<SeekBar
  android:id="@+id/拖动条ID"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:max="100"
/>

提示

  • 可使用 `thumb` 属性设置进度条样式
  • 可使用 `拖动条.setProgress` 方法设置拖动值

# 星级评分条 RatingBar

<RatingBar
  android:id="@+id/星级评分条ID"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:numStars="5"
  android:rating="3"
  android:stepSize="1"
  android:isIndicator="false"
/>

提示

  • 可使用 `android:numStars` 属性设置星级的数量
  • 可使用 `android:rating` 属性设置默认选择星级的数量
  • 可使用 `android:stepSize` 属性设置选择步长(默认可选择半颗星)
  • 可使用 `android:isIndicator="true"` 属性设置只读
  • 可使用 `星级评分条.getRating()` 方法获取当前选择的星级

# 下拉列表

<Spinner
  android:id="@+id/下拉列表ID"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:entries="@array/数组名称"
/>

新建\src\res\values\arrays.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="数组名称">
        <item>列表项1</item>
        <item>列表项2</item>
        <item>列表项3</item>
    </string-array>
</resources>

通过适配器设置列表项:

Spinner spinner = (ListView)findViewById(下拉列表ID);

String [] 数组名称 = new String[]{"列表项1","列表项2"}
ArrayAdpter<String> adapter = new ArrayAdpter<String>(this.android.R.layout.simple.list_item_1,数组名称)
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
spinner.setAdapter(adapter)

# 列表视图

<ListView
  android:id="@+id/列表视图ID"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:entries="@array/数组名称"
/>

新建\src\res\values\arrays.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="数组名称">
        <item>列表项1</item>
        <item>列表项2</item>
    </string-array>
</resources>

通过适配器设置列表项:

ListView listView = (ListView)findViewById(列表视图ID);

String [] 数组名称 = new String[]{"列表项1","列表项2"}
ArrayAdpter<String> adapter = new ArrayAdpter<String>(this.android.R.layout.simple.list_item_1,数组名称)
listView.setAdapter(adapter)

# 滚动视图

提示

滚动视图中只能包含一个组件,一般包含其他布局(如线性布局)

# 垂直滚动

<ScrollView
  android:layout_width="math_parent"
  android:layout_height="wrap_content">
</ScrollView>

# 水平滚动

<HorizontalScrollView
  android:layout_width="wrap_content"
  android:layout_height="math_parent">
</ScrollView>

# 选项卡

将自带的布局改为 `TabHost` ,并删除 padding 边距

<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@android:id/tabhost"
  android:layout_width="math_parent"
  android:layout_height="math_parent">
  <TabWidget
    android:id="@android:id/tabs"
    android:layout_width="math_parent"
    android:layout_height="wrap_content">
  <TabWidget/>
  <FrameLayout
    android:id="@android:id/tabcontent"
    android:layout_width="math_parent"
    android:layout_height="math_parent">
  </FrameLayout>
</TabHost>
TabHost tabHost = (TabHost)findViewById(Android.R.id.tabhost);
tabHost.setip();
LayoutInflater inflater = LayoutInflater.from(this);
inflater.inflate(R.layout.XML页名1,tabHost.getTabContentView());
inflater.inflate(R.layout.XML页名2,tabHost.getTabContentView());

tabHost.addTab(tabHost.newTabSpec("tab1").setIndicator("Tab页面标题1").setContent(R.id.left))
tabHost.addTab(tabHost.newTabSpec("tab2").setIndicator("Tab页面标题2").setContent(R.id.right))
最后更新: 2022/9/12 16:01:28