Android学习

亦余心之所善兮,虽九死其犹未悔。这篇文章主要讲述Android学习相关的知识,希望能为你提供帮助。
##常用控件
所有的安卓控件都需要指定 layout_width 和 layout_height
都具有visibility属性
TextView

< TextView android:id="@+id/txtOne" android:layout_width="match_parent" android:layout_height="wrap_content" android:text = "我是TextView" android:gravity = "center" />

上面的TextView中有下述几个属性:
android:id给当前控件定义了一个**唯一**标识符 android:layout_width="match_parent"让控件的宽度大小和父布局一样 android:layout_height="wrap_content"让控件的高度大小能够刚好包含里面的内容。 android:text指定的显示的文本内容 android:gravity指定文字的对齐方式,可选有top、bottom、left、right、center 等 可以用‘|’来同时指定多个值 例如:top|left android:textSize="40sp" 指定文字大小 android:textColor="#00ff00"指定文字颜色match_parent 填充父布局 由父布局决定控件大小 与 fill_parent含义相同。 wrap_content 含住内容 由控件内容决定控件大小

Button
< Button android:id="@+id/button" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="button" android:textAllCaps="false" />

上面的Button中有下述几个属性:
android:textAllCaps 若不指定则在布局文件中设置的字母始终大写。可以设置为 flase 就可以显示为小写字母

EditText
< EditText android:id="@+id/et_text" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="这里是提示信息" android:maxLines="2"/> android:hint提示性文本 android:maxLines 默认的行数是随着文本变化的,设置最大行数可以保证EditText的高度美观。

ImageView
< ImageView android:id="@+id/image_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="https://www.songbingjia.com/android/@drawable/pig"/> android:src指定需要显示的图片

也可以通过代码动态的修改图片:
public class MainActivity extends AppCompatActivity { private ImageView imageView; private Button button; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); imageView = (ImageView) findViewById(R.id.image_view); button = (Button) findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() {//点击按钮显示图片 @Override public void onClick(View v) { imageView.setImageResource(R.drawable.pig); // 设置显示的图片 } }); } }

ProgressBar
< ProgressBar android:id="@+id/progress_bar" android:layout_width="match_parent" android:layout_height="wrap_content" android:visibility="visible" style="?android:attr/progressBarStyleHorizontal" android:max="100"/> android:visibility所有的Android控件都具有visibility属性,可以进行设定。如果不指定就都是可见的。 可选值由三种 visible、invisible、gone - visible表示控件是可见的。 - invisible表示控件是不可见的,但是仍占据原来的位置和大小 - gone表示空间不可见,也不占据任何屏幕空间 style="?android:attr/progressBarStyleHorizontal" 这是进度条为水平进度条 android:max="100" 设置进度条最大值为100

可以通过代码来设置ProgressBar的可见性:
button.setOnClickListener(new View.OnClickListener() {//点击按钮显示进度条 @Override public void onClick(View v) { if(progressBar.getVisibility() == View.GONE) { progressBar.setVisibility(View.VISIBLE); //设置可见 }else{ progressBar.setVisibility(View.GONE); //设置不可见 } } });

静态修改进度条进度
button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int progress = progressBar.getProgress(); //获取当前进度 progress +=10; progressBar.setProgress(progress); } });

每次点击后进度条增长
AlertDialog
AlertDialog可以在当前的页面弹出一个对话框,这个对话框是置顶与所有界面元素之上的,能够屏蔽调其他控件的交互能力,因此,AlertDialog一般用于提示一些非常重要的内容或者警告信息
button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity.this); dialog.setCancelable(false); //设置不能点击返回键取消 dialog.setTitle("这是一个提示框"); dialog.setMessage("具体提示的一些信息"); dialog.setPositiveButton("是", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { //执行的一些逻辑 } }); dialog.setNegativeButton("否", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { //执行的一些逻辑 } }); dialog.show(); } });

ProgressDialog
与AlertDialog有些类似。都可以在界面上弹出一个对话框。不同的是ProgressDialog会在对话框中显示一个进度条。用法与AlertDialog类似。
4种基本布局LinearLayout 线性布局
LinearLayout是一种常用的布局。 他会将所包含的控件在现行方向上依次排列。可以设置
android:orientation="vertical" 垂直排列 或 android:orientation="horizontal" 水平排列, 这是默认值

可以在布局内部的空间中设置 android:layout_gravity 属性来指定控件相对于布局的位置
在LinearLayout中 允许我们使用比例的方式来指定控件的宽度大小。
< EditText android:id="@+id/et_text" android:layout_width="match_parent" android:layout_weight="1" android:layout_height="wrap_content" android:hint="这里是提示信息" android:maxLines="2"/> < Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="button" android:textAllCaps="false" />

这里制定了EditText的layout_weight属性,将Button的宽度设置为wrap_content EditText会沾满屏幕的剩余空间
RelativeLayout 相对布局
< RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > < Button android:id="@+id/button1" android:text="button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true"/> < !--位于布局的左上--> < Button android:id="@+id/button2" android:text="button2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_alignParentTop="true" /> < !--位于布局的右上/> --> < Button android:id="@+id/button3" android:text="button3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true"/> < !--位于布局的正中心--> < Button android:id="@+id/button4" android:text="button4" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentBottom="true"/> < !--位于布局的左下--> < Button android:id="@+id/button5" android:text="button5" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_alignParentBottom="true"/> < !--位于布局的右下--> < Button android:id="@+id/button6" android:text="button6" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_above="@id/button3" android:layout_toLeftOf="@id/button3"/> < Button android:id="@+id/button7" android:text="button7" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_above="@id/button3" android:layout_toRightOf="@id/button3"/> < Button android:id="@+id/button8" android:text="button8" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/button3" android:layout_toLeftOf="@id/button3"/> < Button android:id="@+id/button9" android:text="button9" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/button3" android:layout_toRightOf="@id/button3"/> < /RelativeLayout> layout_above 表示让这个控件位于指定控件的上方 layout_below 表示让这个控件位于指定控件的下方 layout_toLeftOf 表示让这个控件位于指定控件左方 layout_toRightOf 表示让这个控件在指定控件右方layout_alignParentTop 表示让这个控件在父布局中的上方 layout_alignParentBottom 表示让这个控件在父布局中的下方 layout_alignParentLeft 表示让这个控件在父布局中的左方 layout_alignParentRight 表示让这个控件在父布局中的右方layout_alignLeft 表示让这个控件和另一个控件的左边缘对齐 layout_alignRight 表示让这个控件和另一个控件的右边缘对齐 layout_alignTop 表示让这个控件和另一个控件的上边缘对齐 layout_alignBottom 表示让这个控件和另一个控件的下边缘对齐

FrameLayout 帧布局
在FrameLayout布局模式下, 所有的控件都会默认摆放在布局的左上角
呈现出重叠的效果。
可以使用layout_gravity属性来指定空间在布局中的对齐方式
< FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="match_parent" android:layout_width="match_parent"> < TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="left" android:text="吧啦吧啦"/> < Button android:text="小按钮" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="right"/> < /FrameLayout>

PercentFrameLayout 百分比布局
  1. 需要在app/build.gradle中的的dependencies闭包中添加如下内容:
    implementation ‘com.android.support:percent:26.0.0-alpha1‘
  2. 修改布局文件
    < android.support.percent.PercentFrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" xmlns:app="http://schemas.android.com/apk/res-auto" > < Button android:id="@+id/button1" android:text="button1" android:layout_gravity="left|top" app:layout_widthPercent="50%" app:layout_heightPercent="50%" /> < Button android:id="@+id/button2" android:text="button2" android:layout_gravity="right|top" app:layout_widthPercent="50%" app:layout_heightPercent="50%" /> < Button android:id="@+id/button3" android:text="button3" android:layout_gravity="left|bottom" app:layout_widthPercent="50%" app:layout_heightPercent="50%" /> < Button android:id="@+id/button4" android:text="button4" android:layout_gravity="right|bottom" app:layout_widthPercent="50%" app:layout_heightPercent="50%" /> < /android.support.percent.PercentFrameLayout>

    由于百分比布局并不是内置在系统SDK当中的,所以需要写出完整的包的路径还必须定义一个app的命名空间
    其中 xmlns:app="http://schemas.android.com/apk/res-auto" 是app的命名空间
    app:layout_widthPercent 将各个按钮的宽度指定为布局的50%
    借助layout_gravity来分别将这个4个按钮放置在布局的各个位置。
自定义控件
所有的控件都是直接或者简介继承自View的,
所有布局都是直接或简介继承自ViewGroup的。
自定义布局自定义布局需要引入一个布局
  1. 新建一个布局 起名为title.xml
    < LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content"> < Button android:id="@+id/title_back" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_margin="5dp" android:text="返回" /> < TextView android:layout_width="0dp" android:layout_height="wrap_content" android:layout_gravity="center" android:gravity="center" android:layout_margin="5dp" android:layout_weight="1" android:textSize="24sp" android:text="标题" /> < Button android:id="@+id/title_edit" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="5dp" android:layout_gravity="center" android:text="编辑" /> < /LinearLayout>

  2. 然后在需要引用的布局中加入
    < include layout="@layout/title" />

  3. 在MainActivity.java中把系统自带的标题栏隐藏掉
    protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ActionBar actionbar = getSupportActionBar(); if(actionbar != null) actionbar.hide(); }

自定义控件1.新建一个TitleLayout 继承LinearLayout
public class TitleLayout extends LinearLayout { public TitleLayout(Context context, AttributeSet attrs) { super(context, attrs); LayoutInflater.from(context).inflate(R.layout.title, this); } }重写了LinearLayout中带有两个参数的构造函数,通过LayoutInflater的from()方法可以构建出一个LayoutInflater对象,然后调用inflate()方法就可以动态加载一个布局文件, inflate()方法需要传入两个参数第一个参数是需要加载的布局文件的ID 第二个参数是给加载好的布局文件添加一个父布局。

  1. 在布局文件中修改如下
    < LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent"> < !--完整类名--> < cn.zbuter.myapplication.TitleLayout android:layout_height="wrap_content" android:layout_width="match_parent" /> < /LinearLayout>

3.添加按钮监听。
public class TitleLayout extends LinearLayout { public TitleLayout(Context context, AttributeSet attrs) { super(context, attrs); LayoutInflater.from(context).inflate(R.layout.title, this); Button titleBack = (Button) findViewById(R.id.title_back); Button titleEdit = (Button) findViewById(R.id.title_edit); titleBack.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { ((Activity)getContext()).finish(); } }); titleEdit.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getContext(), "你点击了编辑", Toast.LENGTH_SHORT).show(); } }); } }

ListView
简单用法:
  1. 在activity的布局文件中加入ListView控件
    < LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    < ListView android:id="@+id/list_view" android:layout_width="match_parent" android:layout_height="match_parent" />


  2. 在java文件中修改
    public class MainActivity extends AppCompatActivity { //需要展示的数据 private String[] data = https://www.songbingjia.com/android/{"Apple", "Banana", "Orange", "Watermelon","Pear"}; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ArrayAdapter< String> adapeter = new ArrayAdapter< String> (MainActivity.this,R.layout.support_simple_spinner_dropdown_item,data); ListView listView = (ListView) findViewById(R.id.list_view); //设置ListView的适配器 listView.setAdapter(adapeter); } }

定制ListView的界面
  1. 定义一个实体类,作为ListView适配器的适配类型,新建一个名为Fruit的类
    public class Fruit { private String name; private int imageId; public Fruit(String name, int imageId){ this.name = name ; this.imageId = imageId; }public int getImageId() { return imageId; }public String getName() { return name; } }

  2. 为ListView的子项指定一个自定义的布局。 在layout目录下新建fruit_item.xml
    < LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent"> < ImageView android:id="@+id/fruit_image" android:layout_width="wrap_content" android:layout_height="wrap_content" /> < TextView android:id="@+id/fruit_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="10dp"android:layout_gravity="center_vertical" /> < /LinearLayout>

  3. 创建自定义适配器继承ArrayAdapter 并将泛型指定为Fruit
    public class FruitAdapter extends ArrayAdapter< Fruit> { private int resourceId; public FruitAdapter(Context context, int resource, List< Fruit> objects) { super(context, resource, objects); this.resourceId = resource; }//在每个子项被滚动到屏幕内的时候会被调用这个方法 public View getView(int position, View convertView, ViewGroup parent) { Fruit fruit = getItem(position); //获取当前项的Fruit实例 View view = LayoutInflater.from(getContext()).inflate(resourceId,parent,false); // 为子项加载我们传入的布局 ImageView fruit_image = (ImageView) view.findViewById(R.id.fruit_image); TextView fruit_name = (TextView) view.findViewById(R.id.fruit_name); fruit_image.setImageResource(fruit.getImageId()); fruit_name.setText(fruit.getName()); return view; } }

  4. 【Android学习】修改MainActivity代码


来自为知笔记(Wiz)











    推荐阅读