布局的基本样式
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>