布局的基本样式

LinearLayout(线性布局)

LinearLayout是线性布局控件,它包含的子控件将以横向或竖向的方式排列,按照相对位置来排列所有的widgets或者其他的containers,超过边界时,某些控件将缺失或消失。因此一个垂直列表的每一行只会有一个widget或者是container,而不管他们有多宽,而一个水平列表将会只有一个行高(高度为最高子控件的高度加上边框高度)。LinearLayout保持其所包含的widget或者是container之间的间隔以及互相对齐(相对一个控件的右对齐、中间对齐或者左对齐)。
RelativeLayout相对布局允许子元素指定它们相对于其父元素或兄弟元素的位置,这是实际布局中最常用的布局方式之一。它灵活性大很多,当然属性也多,操作难度也大,属性之间产生冲突的的可能性也大,使用相对布局时要多做些测试。

android:layout_width=""&&layout_height=""(高度和宽度)

value:

wrap_content:内容多少,宽度多少
match_parent:匹配父控件
30dp(安卓提供的分辨率,会根据屏幕的分辨率进行适配)

android:orientation=""(排列方式)

value

horizontal: 指定布局内控件排列方式为 水平排列
vertical:指定布局内控件排列方式为 垂直排列

android:background=""(背景颜色)

value

十六进制的颜色代码如:#66ccff

View(所有控件的父类)

android:padding=""(内边距)

- android:paddingLeft  
- android:paddingTop
- android:paddingBottom
- android:paddingRight

value

30dp

android:layout_margin=""(外边距)

- android:layout_marginTop
- android:layout_marginBottom
- android:layout_marginLeft
- android:layout_marginRight

value

30dp

android:gravity=""(内部元素的对齐方式)

value

right:右对齐
left:左对齐
center:上下左右居中
bottom:底部对齐
top:顶部

android:layout_weight="1"(设置权重)

作用

把剩余的内容按照权重去分配(把默认值剩下的剩余空间按照权重进行分配)

RelativeLayout(相对布局)

android:layout_alignParentBottom="true"

android:layout_alignParentBottom="true"(相对于父控件下对齐)
 android:layout_alignParentRight="true"(相对于父控件右对齐)
 android:layout_alignParentTop="true"(相对于父控件上对齐)
 android:layout_alignParentLeft="true"(相对于父控件左对齐)
android:layout_toRightOf=""(再哪个控件的右边,值传id)
android:layout_below=""(再哪个控件的下边)

Button(按钮)

android:onClick=""(绑定点击事件)

value :java函数名

实现点击按钮跳出弹出框

public void showToast(View view){//一定要加上这个参数
        //在界面中弹出提示的信息
        Toast.makeText(this,"这是弹出的消息",Toast.LENGTH_SHORT).show();
    }

java代码部分(实现效果,界面跳转)

Android中MainActivity.this和this的区别

本质上是没区别的.但是有时候必须要用MainActivity.this 这样的,比如某个控件 setOnClickListener(); 在括号里面new 一个OnClickListener ,然后在onClick方法里面处理的时候必须要用MainActivity.this 而不能用this.表示的就是MainActivity这个类对象本来,这种写法一般用在内部类里,因为在外部类中直接可以用关键字this表示本类,而内部类中直接写this的话表示的是内部类本身,想表示外部类的话就得加上外部类的类名.this。

mBtnTextView=findViewById(R.id.btn_textview);//之前的sdk需要进行强制转换,最新版本的已经不需要了
mBtnTextView.setOnClickListener(new View.OnClickListener() {//绑定点击事件
            //这里new了一个内部对象,所以要使用MainActivity.this
            //对父组件的点击事件进行重写
            @Override
            public void onClick(View view) {
                //设置点击事件,跳转到Textview界面
                Intent intent=new Intent(MainActivity.this,TextViewActivity.class);
                startActivity(intent);
            }
        });

设置圆角xml代码实现

<Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/btn_1"
        android:text="按钮2"
        android:textSize="20sp"
        android:background="@drawable/bg_btn2"
        />

其中的android:background="@drawable/bg_btn2"是引用了res/drawable/bg_btn2.xml之中的样式,以下是bg_btn2.xml中的代码实现

在Android开发中,我们可以使用shape定义各种各样的形状,也可以定义一些图片资源。相对于传统图片来说,使用shape可以减少资源占用,减少安装包大小,还能够很好地适配不同尺寸的手机。

shape就是一个形状定义工具。

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <solid android:color="#ff9900"/>
    <corners
        android:radius="10dp"/>
</shape>

以下是橙色中空圆角的代码实现

bg_btn2.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <stroke
        android:width="1dp"
        android:color="#ff9900"/>
 <corners
     android:radius="10dp"/>
</shape>

设置按压的时候切换样式代码实现

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <!--设置当按钮被按压的时候触发-->
    <item android:state_pressed="true">
        <shape>
            <solid android:color="#6cf"/>
            <corners android:radius="5dp"/>
        </shape>
    </item>
    <!--设置没有被按压的时候的样式-->
    <item android:state_pressed="false">
        <shape>
            <solid android:color="#e00"/>
            <corners android:radius="5dp"/>
        </shape>
    </item>
</selector>

TextView

android:textAllCaps="true"(字母全部大写,false就是小写)

android:layout_gravity="center"(居中对齐)

value

left:左对齐
right:右对齐

android:text=""(设置文本内容)

value

直接写内容:android:text="这是内容"
@string/tv_1 :意思是从res/values/strings.xml之中的
<string name="tv_test1">这是内容</string>
引用当中的文字以上俩个设置最终效果一样

android:textColor="#FFF"(设置文字颜色)

value @color/colorBlack :去values/colors.xml之中找name为colorBlack内容

android:textSize="24sp"(设置文字大小,因为屏幕适配问题,所以最好不要采用dp要采用sp)

android:maxLines=""(限制行数,参数为行数)

android:ellipsize="end"(如果显示不下显示省略号)

android:drawableTop=""(显示图片)

value

//意思是在上方显示及res/drawable/icon_arrow_off的这张图片
android:drawableTop="@drawable/icon_arrow_off"
android:drawableLeft=""    //在左侧显示图片
 android:drawableBottom=""    //在下侧显示图片
 android:drawableRight=""    //在右侧显示图片
 android:drawableTop=""    //在上侧显示图片

android:drawablePadding=""设置图片与文字的距离

Java代码(效果设置中划线或下划线)

TextView mtv4;
mtv4=findViewById(R.id.tv_3);
mtv4.getPaint().setFlags(Paint.STRIKE_THRU_TEXT_FLAG);//中划线
mtv4.getPaint().setAntiAlias(true);//去除锯齿
//添加下划线(只能设置一种设置第二种的时候会把第一种覆盖)
mtv4.getPaint().setFlags(Paint.UNDERLINE_TEXT_FLAG);
//在textview中显示html风格的代码,不能插入图片文本框等
mtv4.setText(Html.fromHtml("<u>下划线文字</u></a><div>我能</div><input type='text'>"));

EditText(输入框文本编辑框)

android:inputType=""(设置输入框的内容格式)

value

textPassword:密码暗文形式
number:数字形式

android:hint="用户名"(设置输入框默认提示的文字)

value值为输入框默认提示的文字

也可以像button一样background引用

一般要设置

android:maxLines="1"这个属性,让输入框只能在一行进行显示

RadioButton(单选框使用)

android:checked="true"(设置默认选中)

使用RadioButton的时候一般要加上RadioGroup把单选框包裹起来,并且要设置id

android:button="@null"(取消默认的选择框)

案例男女单选框

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <RadioGroup
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        >
        <RadioButton
            android:id="@+id/rb_1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="男"
            android:checked="true"
            android:textSize="18sp"
            />
        <RadioButton
            android:id="@+id/rb_2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="女"
            android:textSize="18sp"
            />
    </RadioGroup>
</RelativeLayout>

java代码实现选择的时候获取单选按钮的文字

RadioGroup mRg1 = findViewById(R.id.rg_1);
        mRg1.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(RadioGroup group,@IdRes int checkedId) {
                RadioButton radioButton=group.findViewById(checkedId);
               Toast.makeText(RadioButtonActivity.this,radioButton.getText(),Toast.LENGTH_SHORT).show();
            }
        });

CheckButton(复选框按钮)

java实现按钮选择切换时的状态改变

xml代码

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="15dp"
    >

    <TextView
        android:id="@+id/cb_kaifa"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="你会哪些开发"
        android:textSize="50dp"
        android:textColor="#ee0000"
        />

    <CheckBox
        android:layout_below="@+id/cb_kaifa"
        android:id="@+id/cb_1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="安卓"
        android:textSize="20sp"
        android:textColor="#66ccff"
        />
    <CheckBox
        android:layout_below="@id/cb_1"
        android:id="@+id/cb_2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="20sp"
        android:textColor="#66ccff"
        android:text="h5"
        />
    <CheckBox
        android:layout_below="@id/cb_2"
        android:id="@+id/cb_3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="20sp"
        android:textColor="#66ccff"
        android:text="web"
        />
</RelativeLayout>

java代码

CheckBox mcb1,mcb2;
        mcb1=findViewById(R.id.cb_1);
        mcb2=findViewById(R.id.cb_2);
        mcb1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                Toast.makeText(CheckBoxActivity.this,isChecked?"1选中":"1未选中",Toast.LENGTH_SHORT).show();
            }
        });
        mcb2.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                Toast.makeText(CheckBoxActivity.this,isChecked?"2选中":"2未选中",Toast.LENGTH_SHORT).show();
            }
        });

ImageView (图片控件)

android:src=""(显示的图片)

value 图片的路径

android:scaleType=“”

value

fitXY:把图片缩放成imageView大小,图片可能会被拉伸
默认值fitCenter:保持图片宽高比例缩放直至能够完全显示
centerCrop:保持宽高比例缩放,直至完全覆盖控件,裁剪显示
利用Glide库显示服务器端的图片

AndroidManifest.xml清单文件中配置(只能加载http图片)

<uses-permission android:name="android.permission.INTERNET"/><!--打开安卓的网络请求权限-->
在application中加入android:usesCleartextTraffic="true"    //这样就可以进行http请求了

java代码

ImageView mIv4;
 mIv4=findViewById(R.id.iv_4);
Glide.with(this).load("http://47.100.214.40:7777/storage/file/card/4ZSRD6fPZGvDFWW3c4mqN4USZS8MlUmhM9EftaIY.png").into(mIv4);

ListView (列表视图)

android:divider="#66ccff"(设置列表分割线颜色)

android:dividerHeight="1dp"(设置列表分割线高度)

列表视图java代码实现

ListViewActivity

package com.tz.tian.listview;

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

import com.tz.tian.R;

public class ListViewActivity extends Activity {//直接继承了activity
    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_listview);
        ListView mlv1;
        mlv1=findViewById(R.id.lv_1);
        mlv1.setAdapter(new MyListAdapter(ListViewActivity.this));

       /* mlv1.setOnClickListener(new AdapterView.OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {

            }
        });*/

        //绑定列表长按事件
        mlv1.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {

            @Override
            public boolean onItemLongClick(AdapterView<?> adapterView, View view, int i, long l) {
                Toast.makeText(ListViewActivity.this,"pos"+i,Toast.LENGTH_SHORT).show();
                return false;
            }
        });
    }

}

MyListAdapter.java

package com.tz.tian.listview;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import com.bumptech.glide.Glide;
import com.tz.tian.R;

public class MyListAdapter extends BaseAdapter {
    private Context mContext;
    private LayoutInflater mLayoutInflater;
    public MyListAdapter(Context context){
        this.mContext=context;
        mLayoutInflater=LayoutInflater.from(context);
    }
    @Override
    public int getCount() {
        //数据的长度
        return 10;
    }

    @Override
    public Object getItem(int i) {
        return null;
    }

    @Override
    public long getItemId(int i) {
        return 0;
    }
    //设置一个静态类,分别定义了list视图中的三个控件属性
    static class ViewHolder{
        public ImageView imageView;
        public TextView tvTitle,tvTime,tvContent;
    }
    @Override
    public View getView(int position, View convertView, ViewGroup viewGroup) {
        ViewHolder holder;
        //默认是null
        if(convertView==null){
            //绑定是视图
            convertView=mLayoutInflater.inflate(R.layout.layout_list_item,null);
            holder=new ViewHolder();
            //讲ViewHolder之中的四个属性与id进行绑定
            holder.imageView=convertView.findViewById(R.id.iv);
            holder.tvTitle=convertView.findViewById(R.id.tv_title);
            holder.tvTime=convertView.findViewById(R.id.tv_time);
            holder.tvContent=convertView.findViewById(R.id.tv_content);
            convertView.setTag(holder);
        }else {
            holder=(ViewHolder) convertView.getTag();
        }
        //给控件赋值
        holder.tvTitle.setText("这是标题");
        holder.tvTime.setText("这是时间");
        holder.tvContent.setText("这是内容");
        Glide.with(mContext).load("http://47.100.214.40:7777/storage/file/card/4ZSRD6fPZGvDFWW3c4mqN4USZS8MlUmhM9EftaIY.png").into(holder.imageView);
        return convertView;
    }
}

layout_list_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal" android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="30dp"
    >
    <ImageView
        android:id="@+id/iv"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:scaleType="centerCrop"
        android:background="#fff"
        />
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:paddingLeft="10dp"
        >
        <TextView
            android:id="@+id/tv_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="标题"
            android:textColor="@color/colorPrimary"
            />
        <TextView
            android:id="@+id/tv_time"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="时间"
            android:textColor="@color/colorPrimary"
            />
        <TextView
            android:id="@+id/tv_content"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="内容"
            android:textColor="@color/colorPrimary"
            />
    </LinearLayout>
</LinearLayout>

GridView

android:numColumns="3"(一行显示几列)

android:horizontalSpacing="10dp"(水平间距)

android:verticalSpacing="10dp"(垂直间距)

GridViewActivity.java

package com.tz.tian.griadview;

import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.GridView;
import android.widget.Toast;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

import com.tz.tian.R;
import com.tz.tian.listview.MyListAdapter;

public class GridViewActivity extends AppCompatActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_gridview);
        GridView mgv;
        mgv=findViewById(R.id.gv);
        //设置adapter
        mgv.setAdapter(new MygridViewAdapter(GridViewActivity.this));

        mgv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                Toast.makeText(GridViewActivity.this,"点击"+i,Toast.LENGTH_SHORT).show();
            }
        });

        mgv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> adapterView, View view, int i, long l) {
                Toast.makeText(GridViewActivity.this,"点击"+i,Toast.LENGTH_SHORT).show();
                return false;
            }
        });

    }
}

MygridViewAdapter

package com.tz.tian.griadview;

import android.content.Context;
import android.media.Image;
import android.text.Layout;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import com.bumptech.glide.Glide;
import com.tz.tian.R;

public class MygridViewAdapter extends BaseAdapter {
    private  Context mContext;
    private LayoutInflater mLayoutInflater;
    public MygridViewAdapter(Context context){
        this.mContext=context;
        mLayoutInflater= LayoutInflater.from(context);

    }
    @Override
    public int getCount() {
        return 10;
    }

    @Override
    public Object getItem(int i) {
        return null;
    }

    @Override
    public long getItemId(int i) {
        return 0;
}
    static class ViewHolder{
        public ImageView imageView;
        public TextView textView;
    }
    @Override
    public View getView(int position, View convertView, ViewGroup viewGroup) {
        ViewHolder holder=null;
        if (convertView==null){
            //inflate()的作用就是将一个用xml定义的布局文件查找出来,注意与findViewById()的区别,
            // inflate是加载一个布局文件,而findViewById则是从布局文件中查找一个控件。
            convertView=mLayoutInflater.inflate(R.layout.layout_grid_item,null);
            holder=new ViewHolder();
            holder.imageView=convertView.findViewById(R.id.iv_grid);
            holder.textView=convertView.findViewById(R.id.tv_title);
            convertView.setTag(holder);
        }else{
            holder=(ViewHolder)convertView.getTag();
        }
        //赋值
        holder.textView.setText("花");
        Glide.with(mContext).load("http://47.100.214.40:7777/storage/file/card/p4C0R64SQf8Bb2czsYVGX44DNuv0th8rpkwZliMv.png").into(holder.imageView);
        
        return convertView;
    }
}

activity_gridview.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <GridView
        android:id="@+id/gv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:numColumns="3"

        ></GridView>
</LinearLayout>

layout_grid_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ImageView
        android:id="@+id/iv_grid"
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:scaleType="fitCenter"
        android:background="#000"
        />
    <TextView
        android:id="@+id/tv_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="hello"
        android:layout_gravity="center"
        android:textColor="@color/colorPrimary"
        />
</LinearLayout>

ScrollView(垂直滚动视图)

之下只能有一个子元素

HorizontalScrollView(水平滚动布局)

之下只能有一个子元素

<HorizontalScrollView
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:orientation="horizontal"
                >
                <Button
                    android:layout_width="200dp"
                    android:layout_height="300dp"
                    android:text="Test"
                    android:textAllCaps="false"
                    />
                <Button
                    android:layout_width="200dp"
                    android:layout_height="300dp"
                    android:text="Test"
                    android:textAllCaps="false"
                    />
                <Button
                    android:layout_width="200dp"
                    android:layout_height="300dp"
                    android:text="Test"
                    android:textAllCaps="false"
                    />
            </LinearLayout>
        </HorizontalScrollView>

Adapter

Adapter(适配器的讲解)

适配器就我自己来看,我觉得这是一个非常重要的知识点,Adapter是用来帮助填出数据的中间桥梁,简单点说吧:将各种数据以合适的形式显示在View中给用户看。Adapter有很多的接口、抽象类、子类可以使用。

RecycleView

使用方式

添加

implementation('com.android.support:design:25.3.1')

LinearRecyclerViewActivity.java

package com.tz.tian.recyclerview;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.graphics.Rect;
import android.os.Bundle;
import android.view.View;
import android.widget.LinearLayout;

import com.tz.tian.R;

public class LinearRecyclerViewActivity extends AppCompatActivity {
    private RecyclerView mRvMain;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_linear_recycler_view);
        mRvMain=findViewById(R.id.rv_main);
        mRvMain.setLayoutManager(new                     LinearLayoutManager(LinearRecyclerViewActivity.this));//本类添加线性布局
        mRvMain.addItemDecoration(new MyDecoration());//实现分割线功能
        //本类,添加适配器,传入外部类为参数
        mRvMain.setAdapter(new LinearAdapter(LinearRecyclerViewActivity.this));
        
    }
    //继承抽象类,覆盖其中的方法
    class MyDecoration extends RecyclerView.ItemDecoration{
        @Override
        public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
            super.getItemOffsets(outRect, view, parent, state);
            //设置左,上,右,下的值,从values/dimen.xml中name=dividerHeight的属性取值
            //在每一个元素之下添加一个dp的间距
           outRect.set(0,0,0,getResources().getDimensionPixelOffset(R.dimen.dividerHeight));
        }
    }
}

dimen.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
   <dimen name="dividerHeight">1dp</dimen>
</resources>

LinearRecyclerViewActivity.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/rv_main"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/colorPrimary"
        />
</RelativeLayout>

LayoutInflater.from()

该方法最终会拿到一个PhoneLayoutInflater实例,它继承了LayoutInflater抽象类

inflate()

由上可知,其实我们获取到的其实是PhoneLayoutInflater实例,而PhoneLayoutInflater继承了LayoutInflater抽象类,其实调的是LayoutInflater中的inflate方法

inflate方法有四个重载

//A
public View inflate(@LayoutRes int resource, @Nullable ViewGroup root)

// B
public View inflate(XmlPullParser parser, @Nullable ViewGroup root)

// C
public View inflate(@LayoutRes int resource, @Nullable ViewGroup root, boolean attachToRoot)

// D
public View inflate(XmlPullParser parser, @Nullable ViewGroup root, boolean attachToRoot)

第一个参数,id号,第二个参数列表本身,第三个参数决定是否让root成为返回值的父控件,第四个参数xml解析器

Android LayoutInflater详解

在实际开发中LayoutInflater这个类还是非常有用的,它的作用类似于findViewById()。不同点是LayoutInflater是用来找res/layout/下的xml布局文件,并且实例化;而findViewById()是找xml布局文件下的具体widget控件(如Button、TextView等)。

具体作用:

1、对于一个没有被载入或者想要动态载入的界面,都需要使用LayoutInflater.inflate()来载入;

2、对于一个已经载入的界面,就可以使用Activiyt.findViewById()方法来获得其中的界面元素。

LinearAdapter.java(适配器)

package com.tz.tian.recyclerview;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import com.tz.tian.R;

import java.util.List;
//传入内部类中所定义的泛型
public class LinearAdapter extends RecyclerView.Adapter <LinearAdapter.LinearViewHolder>{

    private Context mContext;
    //构造方法
    public LinearAdapter(Context context){
        this.mContext=context;//接收一个context参数
    }
    @NonNull
    @Override//创建viewholder并返回
    public LinearAdapter.LinearViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        //new一个刚才书写的内部类,调用静态的from方法,传入layout_linear_item.xml,返回一个view
        return new LinearViewHolder(LayoutInflater.from(mContext).inflate(R.layout.layout_linear_item,parent,false));
    }

    @Override//绑定viewholder
    public void onBindViewHolder(@NonNull LinearAdapter.LinearViewHolder holder, final int position) {
        holder.textView.setText("hello world");
        holder.itemView.setOnClickListener(new View.OnClickListener() {//设置点击事件
            @Override
            public void onClick(View view) {
                Toast.makeText(mContext,"click"+position,Toast.LENGTH_SHORT).show();//弹出提示
            }
        });
    }

    @Override
    public int getItemCount() {        //返回的列表个数
        return 30;
    }
    //继承RecyclerView.ViewHolder
    class LinearViewHolder extends RecyclerView.ViewHolder {//定义泛型
        private TextView textView;//声明布局控件
        //实现构造方法
        public LinearViewHolder(@NonNull View itemView) {
            super(itemView);
            //用传入的itemView去查找并绑定视图
            textView=(TextView)itemView.findViewById(R.id.tv_title);
        }
    }
}

activity_linear_recycler_view.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/rv_main"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/colorPrimary"
        />
</RelativeLayout>

WebView

加载url(网络或者本地assets文件夹下的html文件)

加载html代码

Nativity和JavaScript互相调用

加载网络url

webview.loadUrl("http://www.baidu.com");

加载assets下的文件

webview.loadUrl("")

直接加载html代码

webview.loadData();

webview.loadDataWithBaseURL();//这个在编码上出现的问题会少一些

网页的前进后退

webview.canGoback() //判断是否能返回

webview.goBack() //调用返回方法

webview.canGoForward()//判断是否可以前进

webview.goForward()//后退

webview.canGoBackOrForward(int steps)//向前走传入的步数

webview.gobackOrForward(int sqteps)//向后走传入的步数

当按下返回键,默认hi退出当前activity,如果希望是webview内部页面后退

可以重写activity的onKeyDown方法

@Override
    public boolean onKeyDown(int keyCode,KeyEvent event){
        //如果按的是返回键并且webview可以返回,就进行返回
        if((keyCode== KeyEvent.KEYCODE_BACK)&&mWvMain.canGoBack()){
            mWvMain.goBack();
            return true;//return false表示这个事件后续还可以进行处理
        }
        return super.onKeyDown(keyCode,event);
    }

在main下创建assets方法

package com.tz.tian;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.webkit.WebView;

public class WebViewActivity extends AppCompatActivity {
    private WebView mWvMain;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_web_view);
        mWvMain=findViewById(R.id.wv);
        //加载main目录下的assets/test.html
        mWvMain.loadUrl("file:///android_asset/test.html");
        
        //加载网络图片
        
        mWvMain.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                return false;
            }
        });
        mWvMain.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
        mWvMain.loadUrl("https://m.baidu.com");
    }
}

Toast(消息提示组件)

设置显示的位置,自定义显示的内容,简单封装

Toast 是一个 View 视图,快速的为用户显示少量的信息。 Toast 在应用程序上浮动显示信息给用户,不会获得焦点,不影响用户的输入或其他操作,主要用于 一些帮助或者提示。

Toast 最常见的创建方式是使用静态方法 Toast.makeText

第一个参数:this,是上下文参数,指当前页面显示

第二个参数:要显示的字符串。也可是R.string中字符串ID

第三个参数:显示的时间长短。Toast默认的有两个LENGTH_LONG(长3.5秒)和LENGTH_SHORT(短2秒),也可以使用毫秒如1000ms(不建议)

layout_toast.xml(自定义弹出框)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="#6cf"
    android:gravity="center"
    >
    <LinearLayout
        android:layout_width="200dp"
        android:layout_height="200dp"
        android:orientation="vertical"
        android:gravity="center"
        >
        <ImageView
            android:id="@+id/iv_toast"
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:scaleType="fitCenter"
            />
        <TextView
            android:id="@+id/tv_toast"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textSize="18sp"
            android:textColor="#000"
            android:layout_marginTop="10dp"
            />
    </LinearLayout>
</LinearLayout>

activity_toast.xml (主界面)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    >
    <Button
        android:id="@+id/btn_toast_1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="默认"
        />
    <Button
        android:id="@+id/btn_toast_2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="改变位置"
        />
    <Button
        android:id="@+id/btn_toast_3"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="带图片(自定义)"
        />
    <Button
        android:id="@+id/btn_toast_4"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="toastutil"
        />
</LinearLayout>

ToastAcitivity.java(主界面)

package com.tz.tian;

import androidx.appcompat.app.AppCompatActivity;

import android.media.Image;
import android.os.Bundle;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.tz.tian.util.ToastUtil;

public class ToastActivity extends AppCompatActivity {

    private Button mBtnToast1,mBtnToast2,mBtnToast3,mBtnToast4;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_toast);
        mBtnToast1=findViewById(R.id.btn_toast_1);
        mBtnToast2=findViewById(R.id.btn_toast_2);
        mBtnToast3=findViewById(R.id.btn_toast_3);
        mBtnToast4=findViewById(R.id.btn_toast_4);
        Onclick onclick=new Onclick();
        mBtnToast1.setOnClickListener(onclick);
        mBtnToast2.setOnClickListener(onclick);
        mBtnToast3.setOnClickListener(onclick);
        mBtnToast4.setOnClickListener(onclick);
    }
    class Onclick implements View.OnClickListener{

        @Override
        public void onClick(View v) {
            switch (v.getId()){
                case R.id.btn_toast_1:
                    Toast.makeText(getApplicationContext(),"toast",Toast.LENGTH_LONG).show();
                    break;
                case R.id.btn_toast_2:
                    Toast toastCenter = Toast.makeText(getApplicationContext(), "居中Toast", Toast.LENGTH_LONG);
                    //设置居中三个参数分别表示(起点位置,水平向右位移,垂直向下位移)
                    toastCenter.setGravity(Gravity.CENTER,0,0);
                    toastCenter.show();
                    break;
                case R.id.btn_toast_3:
                    Toast toastCustom=new Toast(getApplicationContext());
                    LayoutInflater inflater=LayoutInflater.from(ToastActivity.this);
                    View view=inflater.inflate(R.layout.layout_toast,null);
                    ImageView imageView=view.findViewById(R.id.iv_toast);
                    TextView textView=view.findViewById(R.id.tv_toast);
                    imageView.setImageResource(R.drawable.image1);
                    textView.setText("自定义toast");
                    toastCustom.setView(view);
                    toastCustom.setDuration(Toast.LENGTH_LONG);//设置i西安市时间
                    toastCustom.show();
                    break;
                case R.id.btn_toast_4:
                    ToastUtil.showMsg(getApplicationContext(),"包装过的toast");
                    break;
            }

        }
    }
}

ToastUtil.java(java工具类)

package com.tz.tian.util;

import android.content.Context;
import android.widget.Toast;

public class ToastUtil {
    public static Toast mToast;
    //静态的工具类,传入当前的上下文环境,和信息
    public static void showMsg(Context context, String msg){
        if(mToast==null){//判断是否在显示状态
            mToast=Toast.makeText(context,msg,Toast.LENGTH_LONG);//这个方法返回一个toast
        }else{
            mToast.setText(msg);//重新设置内容
        }
        mToast.show();//调用show方法
    }
}

AlertDialog

默认样式,单选样式,多选样式,自定义样式

activity_dialog.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="10dp"
    >
    <EditText
        android:id="@+id/et_username"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="username"
        android:maxLines="1"
        />
    <EditText
        android:id="@+id/et_password"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="password"
        android:inputType="textPassword"
        android:maxLines="1"
        android:layout_marginTop="10dp"
        />
    <Button
        android:id="@+id/btn_logins"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="login"
        android:textAllCaps="false"
        android:layout_marginTop="10dp"
        />
</LinearLayout>

DialogActivity.java

只是在android的alertDialog中封装好的一些Button 这些Button和普通的Button没有任何区别,可以写任意的方法,只是命名上的不同,一般有三个Button:PositiveButton,NegativeButton,NeutralButton。从名字可以看的出来,代表确定,否定,和中立,其实三个Button可以写你任意的方法,只是位置上的不同而已,确定Button一般靠左,这是阅读习惯。本质上都是三个Button并没有很大的区别

package com.tz.tian;

import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;

import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

import com.tz.tian.util.ToastUtil;

public class DialogActivity extends AppCompatActivity {
    private Button mBtnDialog1,mBtnDialog2,mBtnDialog3,mBtnDialog4,mBtnDialog5;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_dialog);
        mBtnDialog1=findViewById(R.id.btn_dialog1);
        mBtnDialog2=findViewById(R.id.btn_dialog2);
        mBtnDialog3=findViewById(R.id.btn_dialog3);
        mBtnDialog4=findViewById(R.id.btn_dialog4);
        mBtnDialog5=findViewById(R.id.btn_dialog5);
        OnClick onclick=new OnClick();
        mBtnDialog1.setOnClickListener(onclick);
        mBtnDialog2.setOnClickListener(onclick);
        mBtnDialog3.setOnClickListener(onclick);
        mBtnDialog4.setOnClickListener(onclick);
        mBtnDialog5.setOnClickListener(onclick);

    }

    class OnClick implements View.OnClickListener{
        @Override
        public void onClick(View view) {
            Intent intent=null;
            switch (view.getId()){
                case R.id.btn_dialog1:
                    //build模式,调用构造方法传入当前外部对象
                    AlertDialog.Builder builder=new AlertDialog.Builder(DialogActivity.this);
                    //因为返回的就是builder对象,所以可以直接连缀操作
                    builder.setTitle("请回答").setMessage("你觉得如何")
                            //这里的OnClickListener是DialogInterface下的,平时用的是view下的
                            .setIcon(R.drawable.image1)
                    .setPositiveButton("棒", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {
                            ToastUtil.showMsg(DialogActivity.this,"你很诚实");
                        }
                    }).setNeutralButton("还行",new DialogInterface.OnClickListener(){
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {
                            ToastUtil.showMsg(DialogActivity.this,"你很看看");
                        }
                    }).setNegativeButton("不好", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {
                            ToastUtil.showMsg(DialogActivity.this,"瞎说");
                        }
                    }).show();
                    break;
                case R.id.btn_dialog2:
                    //设置性别为一个数组
                    final String [] array2=new String[]{"男","女"};
                    AlertDialog.Builder builder2=new AlertDialog.Builder(DialogActivity.this);
                    //将array2设置入item内容,同样是DialogInterface下的OnClickListener
                    builder2.setTitle("选择性别").setItems(array2, new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {
                            //打印出第数组中的第i个数字
                            ToastUtil.showMsg(DialogActivity.this,array2[i]);
                        }
                    }).show();
                    break;
                case R.id.btn_dialog3:
                    final String [] array3=new String[]{"男","女"};
                    AlertDialog.Builder builder3=new AlertDialog.Builder(DialogActivity.this);
                    //传入的第一个参数1数组,2选中项,3点击事件的对象,一个单选按钮
                    builder3.setSingleChoiceItems(array3, 0, new DialogInterface.OnClickListener() {
                        @Override
                        //dialogInterface为弹出框对象i为数组索引
                        public void onClick(DialogInterface dialogInterface, int i) {
                            ToastUtil.showMsg(DialogActivity.this,array3[i]);
                            dialogInterface.dismiss();//点击之后关闭弹出框
                        }
                    }).setCancelable(false).show();//设置点击外面对话框不会消失
                    break;
                case R.id.btn_dialog4:
                    final String [] array4=new String[]{"唱歌","跳舞","写代码"};
                    boolean[] isSelect=new boolean[]{false,false,true};
                    AlertDialog.Builder builder4=new AlertDialog.Builder(DialogActivity.this);
                    builder4.setTitle("选择兴趣").
                            //传参,1数组,2布尔类型数组和第一个数组一一对应我决定了,哪些按钮被选中
                            setMultiChoiceItems(array4, isSelect, new DialogInterface.OnMultiChoiceClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i, boolean b) {
                            ToastUtil.showMsg(DialogActivity.this,array4[i]+":"+b);
                        }
                    }).setPositiveButton("确定", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {

                        }
                    }).setNegativeButton("取消", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {

                        }
                    }).show();
                    break;
                case R.id.btn_dialog5:
                    AlertDialog.Builder builder5=new AlertDialog.Builder(DialogActivity.this);
                    //加载外部的view视图
                    View view1 = LayoutInflater.from(DialogActivity.this).inflate(R.layout.layout_dialog, null);
                    EditText etUserName=view1.findViewById(R.id.et_username);
                    EditText etPassWord=view1.findViewById(R.id.et_password);
                    Button btnLogin=view1.findViewById(R.id.btn_logins);
                    btnLogin.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                        }
                    });
                    //set设置视图
                    builder5.setTitle("请先登录").setView(view1).show();
                    break;
            }
        }
    }
}

ProgressBar

android:visbility="visible" //隐藏控件位置还在

android:max="100" 进度最大值

android:progress="10" 当前进度值

android:secondaryProgress="30" //二级进度值

android:progressDrawable="" //自定义样式

在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口

Thread类是在java.lang包中定义的。一个类只要继承了Thread类同时覆写了本类中的

run()方法就可以实现多线程操作了,但是一个类只能继承一个父类,这是此方法的局限。

在使用Runnable定义的子类中没有start()方法,只有Thread类中才有。

android:indeterminateDrawable

设置绘制不显示进度的进度条的Drawable对象

activity_progress.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_horizontal"
    android:orientation="vertical"
    android:padding="15dp"
    >
    <ProgressBar
        android:id="@+id/pb1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"

        />
    <!--默认的是 style="@android:style/Widget.Material.ProgressBar"-->
    <!--灰色的-->
    <ProgressBar
        android:id="@+id/pb2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        style="@android:style/Widget.ProgressBar"
        android:layout_marginTop="10dp"
        />
    <!--橙色加载条,灰底,宽-->
    <ProgressBar
        android:id="@+id/pb3"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        style="@android:style/Widget.ProgressBar.Horizontal"
        android:layout_marginTop="10dp"
        android:max="100"
        android:progress="10"
        />
    <!--绿色进度条灰底,窄-->
    <ProgressBar
        android:id="@+id/pb4"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        style="@android:style/Widget.Material.ProgressBar.Horizontal"
        android:layout_marginTop="10dp"
        android:max="100"
        android:progress="10"
        android:secondaryProgress="30"
        tools:targetApi="lollipop" />
    <Button
        android:id="@+id/btn_start"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="模拟进度"
        android:layout_marginTop="10dp"
        />
    
    <!--引用自己定义的values/styles.xml/MyProgressBar属性最后指向了 bg_progress.xml-->
    <ProgressBar
        android:id="@+id/pb5"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        style="@style/MyProgressBar"
        />
    <Button
        android:id="@+id/btn_progress_dialog1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Progressdialog1"
        android:textAllCaps="false"
        android:layout_marginTop="10dp"
        />
    <Button
        android:id="@+id/btn_progress_dialog2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Progressdialog2"
        android:textAllCaps="false"
        android:layout_marginTop="10dp"
        />

</LinearLayout>

ProgressActivity.java

Handler.java:

一个处理msg的工具,它有两个方法:sendMessage()和handleMessage()

Handler主要用于异步消息的处理:当发出一个消息之后,首先进入一个消息队列,发送消息的函数即刻返回,而另外一个部分在消息队列中逐一将消息取出,然后对消息进行处理,也就是发送消息和接收消息不是同步的处理。 这种机制通常用来处理相对耗时比较长的操作。

  

package com.tz.tian;

import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;

import androidx.appcompat.app.AppCompatActivity;

import com.tz.tian.util.ToastUtil;

public class ProgressActivity extends AppCompatActivity {
    private ProgressBar mPb3;
    private Button mBtnStart,mBtnProgressDialog1,mBtnProgressDialog2;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_progress);

        mPb3=findViewById(R.id.pb3);
        mBtnStart=findViewById(R.id.btn_start);
        mBtnProgressDialog1=findViewById(R.id.btn_progress_dialog1);
        mBtnProgressDialog2=findViewById(R.id.btn_progress_dialog2);
        mBtnStart.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                handler.sendEmptyMessage(0);
            }
        });
        //mPb3.setProgress(30);

        mBtnProgressDialog1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ProgressDialog progressDialog=new ProgressDialog(ProgressActivity.this);
                progressDialog.setTitle("提示");
                progressDialog.setMessage("正在加载");
                //监听是否弹出,弹出就执行打印信息
                progressDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
                    @Override
                    public void onCancel(DialogInterface dialogInterface) {
                        ToastUtil.showMsg(ProgressActivity.this,"canel");
                    }
                });
                //progressDialog.setCancelable(false);//设置无法消失
                progressDialog.show();
            }
        });


        mBtnProgressDialog2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                ProgressDialog progressDialog=new ProgressDialog(ProgressActivity.this);
                progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
                progressDialog.setTitle("提示");
                progressDialog.setMessage("正在下载");
                progressDialog.show();
            }
        });

    }
    //handler 是容器,runnable是线程
    Handler handler=new Handler(){
        public void handleMessage(Message msg){
            super.handleMessage(msg);
            //如果进度条小于100
            if(mPb3.getProgress()<100){
                handler.postDelayed(runnable,500);
            }else{
                ToastUtil.showMsg(ProgressActivity.this,"加载完成");
            }
        }
    };

    Runnable runnable=new Runnable() {
        @Override
        public void run() {
            mPb3.setProgress(mPb3.getProgress()+5);
            handler.sendEmptyMessage(0);
        }
    };
}

drawable/bg_progress.xml

animated-rotate 制作简单的动画

设置图片,旋转中心

<?xml version="1.0" encoding="utf-8"?>
<!--xy设置旋转点-->
<animated-rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/luo"
    android:pivotX="50%"
    android:pivotY="50%"
    >

</animated-rotate>

values/styles.xml

<resources>
    
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        
    </style>
    <style name="MyProgressBar">
        <item name="android:indeterminateDrawable">@drawable/bg_progress</item>
    </style>
</resources>

PopupWindow下拉列表

activity_custom.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <Button
        android:id="@+id/btn_pop"
        android:layout_width="150dp"
        android:layout_height="wrap_content"
        android:text="POP"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="50dp"
        />
</LinearLayout>

PopupWindowActivity.java

package com.tz.tian;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.PopupWindow;
import android.widget.TextView;

import com.tz.tian.util.ToastUtil;

import org.w3c.dom.Text;

public class PopupWindowActivity extends AppCompatActivity {
    private Button mBtnPop;
    private PopupWindow mPop;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_popup_window);
        mBtnPop=findViewById(R.id.btn_pop);
        mBtnPop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                View view=getLayoutInflater().inflate(R.layout.layout_pop,null);//找到视图
                TextView textView=view.findViewById(R.id.tv_good);
                //给下拉菜单的其中一个绑定点击事件
                textView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        mPop.dismiss();
                        ToastUtil.showMsg(PopupWindowActivity.this,"好");
                    }
                });

                //第一个参数指定PopupWindow的锚点view,即依附在哪个view上。
                //第二个参宽度,第三个高度,第四个是否获得焦点
                mPop=new PopupWindow(view,mBtnPop.getWidth(), ViewGroup.LayoutParams.WRAP_CONTENT);
                mPop.setOutsideTouchable(true);//设置点击外部区域消失
                mPop.setFocusable(true);//再次点击可以收回下拉菜单
                mPop.showAsDropDown(mBtnPop);//设置在哪个控件下进行显示
            }
        });
    }
}

layout_pop.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >
    <TextView
        android:id="@+id/tv_good"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="20sp"
        android:textColor="@color/grey"
        android:text="好"
        android:gravity="center"
        android:paddingTop="8dp"
        android:paddingBottom="8dp"
        />
    <View
        android:layout_width="match_parent"
        android:layout_height="0.5dp"
        android:background="@color/grey"/>
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="20sp"
        android:textColor="@color/grey"
        android:text="还行"
        android:gravity="center"
        android:paddingTop="8dp"
        android:paddingBottom="8dp"
        />
    <View
        android:layout_width="match_parent"
        android:layout_height="0.5dp"
        android:background="@color/grey"/>
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="20sp"
        android:textColor="@color/grey"
        android:text="不好"
        android:gravity="center"
        android:paddingTop="8dp"
        android:paddingBottom="8dp"
        />
</LinearLayout>
Last modification:April 24, 2022
如果觉得我的文章对你有用,请随意赞赏