Android学习笔记(二)
文章目录
上接博客: https://blog.csdn.net/wang342626/article/details/85796699
十一.RecycleView
Build.gradle中添加, 后面的数字可以相应的修改
implementation 'com.android.support:recyclerview-v7:23.2.1'
导入包,不要导错了
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
RecycleView最简洁的写法
- 建立一个xml
<android.support.v7.widget.RecyclerView
android:id="@+id/rv_main"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/colorGrayDark">
</android.support.v7.widget.RecyclerView>
- 再建立一个xml, 名叫 layout_linear_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="wrap_content"
android:background="@color/colorWhite">
<TextView
android:id="@+id/tv_title"
android:layout_width="match_parent"
android:layout_height="50dp"
android:gravity="center"
android:textColor="#000000"
android:text="Hello"
android:textSize="20sp"/>
</LinearLayout>
package com.taifua.androidlearning.recyclerview;
import android.graphics.Rect;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.Toast;
import com.taifua.androidlearning.R;
public class LinearRecyclerViewActivity extends AppCompatActivity
{
private RecyclerView mRvMain;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_linear_recycle_view);
mRvMain = findViewById(R.id.rv_main);
mRvMain.setLayoutManager(new LinearLayoutManager(LinearRecyclerViewActivity.this));
mRvMain.addItemDecoration(new MyDecoration());
mRvMain.setAdapter(new LinearAdapter(LinearRecyclerViewActivity.this));
}
// 装饰item的内部类
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);
outRect.set(0, 0, 0, getResources().getDimensionPixelOffset(R.dimen.dividerHeight));
}
}
}
- 新建一个java 名叫 LinearAdapter.java 继承RecyclerView.Adapter
E需要修改为下面的内部类对象
package com.example.xuanke;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
public class LinearAdapter extends RecyclerView.Adapter<XKinfoRvAdapter.RvViewHolder> {
private Context mContext;
public XKinfoRvAdapter(Context context){
this.mContext = context;
}
// 注入每一个item的xml
@Override
public RvViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
return new RvViewHolder(LayoutInflater.from(mContext).inflate(R.layout.layout_item_xk, viewGroup, false));
}
@Override
public void onBindViewHolder(RvViewHolder holder, final int position) {
//修改UI
((RvViewHolder)holder).tv_courseId.setText("Haha");
// 添加每一项的点击事件
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ToastUtil.showMsg(mContext, "你点击了第"+position+"项");
}
});
// 添加每一项的长按事件
holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
return true; //返回true后,就不会再调用上面的点击事件了
}
});
}
@Override
public int getItemCount() {
return 10;
}
class RvViewHolder extends RecyclerView.ViewHolder{
private TextView tv_courseId;
public RvViewHolder(@NonNull View itemView)
{
super(itemView);
tv_courseId = itemView.findViewById(R.id.tv_title);
System.out.println("标题是:");
}
}
}
外接点击事件写法
- 再新建一个Activity,名叫LinearRecycleViewActivity,系统会自动完成3个任务,
编辑LinearRecycleViewActivity.java
package com.example.qing.myapplication2.recycleview;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.Toast;
import com.example.qing.myapplication2.R;
import com.example.qing.myapplication2.listViewActivity.ListViewActivity;
public class LinearRecycleViewActivity extends AppCompatActivity {
private RecyclerView mRvMain;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_linear_recycle_view);
mRvMain = (RecyclerView) findViewById(R.id.rv_main);
mRvMain.setLayoutManager(new LinearLayoutManager(LinearRecycleViewActivity.this));
//添加分割线
mRvMain.addItemDecoration(new MyDecoration());
//添加监听器
mRvMain.setAdapter(new LinearAdapter(LinearRecycleViewActivity.this, new LinearAdapter.OnItemClickListener() {
//通过回调方法实现了点击事件放在外面
@Override
public void onClick(int pos) {
Toast.makeText(LinearRecycleViewActivity.this,"在外面LinearRecycleViewActivity.java处理点击事件",Toast.LENGTH_SHORT).show();
}
}));
}
//为了给每一项下面添加一条分割线
class MyDecoration extends RecyclerView.ItemDecoration{
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
super.getItemOffsets(outRect,view,parent,state);
//底部添加一条分割线,需要引用values下面的dimens.xml中的dividerHight
//左 上 右 下
outRect.set(0,0,0,getResources().getDimensionPixelOffset(R.dimen.dividerHight));
}
//另外还可以重写onDraw方法,在加载每一项之前添加装饰
//另外还可以重写onDrawOver方法,在加载每一项之后添加装饰
}
}
- 新建一个LinearAdapter.java
package com.example.qing.myapplication2.recycleview;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;
import com.example.qing.myapplication2.R;
import static android.R.attr.id;
public class LinearAdapter extends RecyclerView.Adapter<LinearAdapter.LinearViewHolder> {
private Context mContext;
private OnItemClickListener mListener;
public LinearAdapter(Context context,OnItemClickListener listener){
this.mContext = context;
this.mListener = listener;
}
@Override
public LinearAdapter.LinearViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new LinearViewHolder(LayoutInflater.from(mContext).inflate(R.layout.layout_linear_item,parent,false));
}
@Override
public void onBindViewHolder(LinearViewHolder holder, final int position) {
holder.textView.setText("Hello World");
//为每一项添加点击事件
holder.itemView.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
Toast.makeText(mContext,"在里面LinearAdapter.java处理点击事件"+position+"项",Toast.LENGTH_SHORT).show();
//调用自定义的接口
mListener.onClick(position);
}
});
}
@Override
public int getItemCount() {
return 30;
}
//定义一个holder
class LinearViewHolder extends RecyclerView.ViewHolder{
public TextView textView;
public LinearViewHolder(View itemView) {
super(itemView);
textView = (TextView) itemView.findViewById(R.id.tv_title);
}
}
//定义一个接口
public interface OnItemClickListener{
void onClick(int pos);
}
}
- 使用代码
<android.support.v7.widget.RecyclerView
android:id="@+id/rv_main"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/colorGrayDark">
</android.support.v7.widget.RecyclerView>
- layout下面新建一个layout_linear_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="wrap_content"
android:background="#FFFFFF"
>
<TextView
android:id="@+id/tv_title"
android:layout_width="match_parent"
android:layout_height="40dp"
android:textColor="#000"
android:textSize="20sp"
android:gravity="center"
android:text="000"
/>
</LinearLayout>
- values下面新建dimens.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="dividerHight">1dp</dimen>
</resources>
- 效果图
RecycleView实现水平方向滚动
- 编辑 activity_hor_recycle_view.xml, 添加一个id为rv_hor的RecyclerView
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.qing.myapplication2.recycleview.HorRecycleViewActivity">
<android.support.v7.widget.RecyclerView
android:id="@+id/rv_hor"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
</android.support.v7.widget.RecyclerView>
</LinearLayout>
- layout下面新建一个layout_hor_item.xml, 这是每一个item项,编写内容
<?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="@color/colorGrayDark"
>
<TextView
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="50dp"
android:textColor="#000000"
android:text="0"
android:textSize="20sp"
/>
</LinearLayout>
- 编辑HorRecycleViewActivity.java:
先获取到id为rv_hor的RecyclerView
然后设置布局管理器,mRvHor.setLayoutManager
装饰线可加可不加, mRvHor.addItemDecoration,装饰线定义为一个内部类
再添加监听器,mRvHor.setAdapter, 待会儿还要新建一个监听器类
package com.example.qing.myapplication2.recycleview;
import android.graphics.Rect;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.Toast;
import com.example.qing.myapplication2.R;
public class HorRecycleViewActivity extends AppCompatActivity {
private RecyclerView mRvHor;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_hor_recycle_view);
mRvHor = (RecyclerView) findViewById(R.id.rv_hor);
//设置布局为水平方向的,和垂直方向的唯一不同点
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(HorRecycleViewActivity.this);
linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
mRvHor.setLayoutManager(linearLayoutManager);
//添加装饰线
mRvHor.addItemDecoration(new MyDecoration());
//设置监听器
mRvHor.setAdapter(new HorAdapter(HorRecycleViewActivity.this, new HorAdapter.OnItemClickListener() {
@Override
public void onClick(int pos) {
Toast.makeText(HorRecycleViewActivity.this,"第"+pos+"项",Toast.LENGTH_SHORT).show();
}
}));
}
//添加分割线的内部类
class MyDecoration extends RecyclerView.ItemDecoration{
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
super.getItemOffsets(outRect, view, parent, state);
//左 上 右 下 添加分割线,需要引用,
//右边撑开了1dp的间距,所以露出了背景色,即分割线
outRect.set(0,0,getResources().getDimensionPixelOffset(R.dimen.dividerHight),0);
}
}
}
- 新建一个监听器类,名为HorAdapter.java,
package com.example.qing.myapplication2.recycleview;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;
import com.example.qing.myapplication2.R;
public class HorAdapter extends RecyclerView.Adapter<HorAdapter.LinearViewHolder> {
private Context mContext;
private OnItemClickListener mListener; //这个是把点击事件外传的类
public HorAdapter(Context context, OnItemClickListener listener){
this.mContext = context;
this.mListener = listener;
}
//onCreateViewHolder函数内规定了,子项目是谁,这里规定的是layout_hor_item
@NonNull
@Override
public HorAdapter.LinearViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new LinearViewHolder(LayoutInflater.from(mContext).inflate(R.layout.layout_hor_item,parent,false));
}
@Override
public void onBindViewHolder(LinearViewHolder holder, final int position) {
holder.textView.setText("Hello Hor");
//为每一项添加点击事件
holder.itemView.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
//Toast.makeText(mContext,"在里面LinearAdapter.java处理点击事件"+position+"项",Toast.LENGTH_SHORT).show();
//调用自定义的接口,用来把点击事件外传, 我这里内部不处理点击事件
mListener.onClick(position);
}
});
}
@Override
public int getItemCount() {
return 20;
}
//定义一个holder,里面定义了layout_hor_item.xml每一个子项目的内部元素
class LinearViewHolder extends RecyclerView.ViewHolder{
public TextView textView;
public LinearViewHolder(View itemView) {
super(itemView);
textView = (TextView) itemView.findViewById(R.id.tv_title);
}
}
//定义一个接口,用来把点击事件外传
public interface OnItemClickListener{
void onClick(int pos);
}
}
- 最后注意细节地方,有的地方可能引用其他参数,别忘了AndroidManifest.xml中声明,联网权限等等
RecycleView实现网格视图
- 准备工作:activity_recycle_view.xml中添加一个按钮,并且在RecycleViewActivity中添加点击事件,点击跳转到GridRecycleViewActivity页面
- 新建一个Activity,名为GridRecycleViewActivity,系统会自动完成3个任务
- 编辑activity_grid_recycle_view.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">
<!--这是每一个子项目的大小,所以宽和高不能全是math_parent-->
<ImageView
android:id="@+id/iv_grid"
android:layout_width="match_parent"
android:layout_height="100dp"
android:scaleType="fitCenter"
android:background="@color/colorAccent"
/>
<TextView
android:id="@+id/tv_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Hello"
android:textColor="@color/colorPrimaryDark"
android:gravity="center"
android:layout_marginTop="5dp"
/>
</LinearLayout>
- layout下新建一个activity_grid_recycleview_item.xml, 这里定义每一个item的内容
<?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="@color/colorAccent"
/>
<TextView
android:id="@+id/tv_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Hello"
android:textColor="@color/colorPrimaryDark"
android:gravity="center"
android:layout_marginTop="10dp"
/>
</LinearLayout>
- 编辑GridRecycleViewActivity,java
首先获取id为rv_grid的RecyclerView
然后添加布局管理器,注意是GridLayoutManager不是LinearLayoutManagerrv_grid.setLayoutManager(new GridLayoutManager(GridRecycleViewActivity.this,3));
装饰线可以加也可以不加rv_grid.addItemDecoration(new MyDecoration());
最后添加监听器 rv_grid.setAdapter(…)
package com.example.qing.myapplication2.recycleview;
import android.graphics.Rect;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.Toast;
import com.example.qing.myapplication2.R;
public class GridRecycleViewActivity extends AppCompatActivity {
private RecyclerView rv_grid;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_grid_recycle_view);
rv_grid = (RecyclerView) findViewById(R.id.rv_grid);
//设置布局管理器,注意是GridLayoutManager不是LinearLayoutManager
rv_grid.setLayoutManager(new GridLayoutManager(GridRecycleViewActivity.this,3));
//添加装饰
rv_grid.addItemDecoration(new MyDecoration());
//添加监听器
rv_grid.setAdapter(new GridAdapter(GridRecycleViewActivity.this,new GridAdapter.OnItemClickListener(){
//处理点击事件
@Override
public void onClick(int pos) {
Toast.makeText(GridRecycleViewActivity.this,"你点击了第"+pos+"项",Toast.LENGTH_SHORT).show();
}
}));
}
class MyDecoration extends RecyclerView.ItemDecoration{
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
super.getItemOffsets(outRect, view, parent, state);
//左 上 右 下
outRect.set(0,0,5,5);
}
}
}
- 新建一个监听器类,GridAdapter.java, 注意复制代码有些地方需要改动,我做了标注了
package com.example.qing.myapplication2.recycleview;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.example.qing.myapplication2.R;
public class GridAdapter extends RecyclerView.Adapter<GridAdapter.LinearViewHolder> {
private Context mContext;
private OnItemClickListener mListener; //这个是把点击事件外传的类
public GridAdapter(Context context, OnItemClickListener listener){
this.mContext = context;
this.mListener = listener;
}
//onCreateViewHolder函数内规定了,子项目是谁,这里规定的是layout_hor_item
@NonNull
@Override
public GridAdapter.LinearViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
//按需变动layout_recycleview_grid_item即可
return new LinearViewHolder(LayoutInflater.from(mContext).inflate(R.layout.layout_recycleview_grid_item,parent,false));
}
@Override
public void onBindViewHolder(LinearViewHolder holder, final int position) {
holder.textView.setText("HelloGridRecycle");
//为每一项添加点击事件
holder.itemView.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
//Toast.makeText(mContext,"在里面LinearAdapter.java处理点击事件"+position+"项",Toast.LENGTH_SHORT).show();
//调用自定义的接口,用来把点击事件外传, 我这里内部不处理点击事件
mListener.onClick(position);
}
});
}
@Override
public int getItemCount() {
return 20;
}
//定义一个holder,里面定义了layout_hor_item.xml每一个子项目的内部元素,按需变动
class LinearViewHolder extends RecyclerView.ViewHolder{
public ImageView imageView;
public TextView textView;
public LinearViewHolder(View itemView) {
super(itemView);
imageView = (ImageView) itemView.findViewById(R.id.iv_grid);
textView = (TextView) itemView.findViewById(R.id.tv_title);
}
}
//定义一个接口,用来把点击事件外传
public interface OnItemClickListener{
void onClick(int pos);
}
}
- 效果图
RecycleView实现瀑布流
1.准备工作: 添加一个按钮,点击跳转到PuRecycleViewActivity新的演示界面
2. 新建一个PuRecycleViewActivity,系统自动完成3个任务
3. 编辑activity_pu_recycle_view.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.qing.myapplication2.recycleview.PuRecycleViewActivity">
<android.support.v7.widget.RecyclerView
android:id="@+id/rv_pu"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</android.support.v7.widget.RecyclerView>
</android.support.constraint.ConstraintLayout>
- 编辑layout_staggeredgrid_recycler_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:background="#FFFFFF">
<ImageView
android:id="@+id/iv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:scaleType="centerCrop" />
</LinearLayout>
- 编辑PuRecycleViewActivity.java
package com.example.qing.myapplication2.recycleview;
import android.graphics.Rect;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.view.View;
import android.widget.Toast;
import com.example.qing.myapplication2.R;
public class PuRecycleViewActivity extends AppCompatActivity {
private RecyclerView mRv_pu;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_pu_recycle_view);
mRv_pu = (RecyclerView) findViewById(R.id.rv_pu);
//布局管理器
//2 VERTICAL 表示垂直的,2列; 3 HORIZONTAL 表示水平的,3行
mRv_pu.setLayoutManager(new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL));
//添加装饰
mRv_pu.addItemDecoration(new MyDecoration());
mRv_pu.setAdapter(new StaggeredGridAdapter(PuRecycleViewActivity.this, new StaggeredGridAdapter.OnItemClickListener() {
@Override
public void onClick(int pos) {
Toast.makeText(PuRecycleViewActivity.this,"你点击了第"+pos+"项",Toast.LENGTH_SHORT).show();
}
}));
}
class MyDecoration extends RecyclerView.ItemDecoration{
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
super.getItemOffsets(outRect, view, parent, state);
int gap = getResources().getDimensionPixelSize(R.dimen.dividerHight5);
outRect.set(gap,gap,gap,gap);
}
}
}
- 编辑StaggeredGridAdapter.java
package com.example.qing.myapplication2.recycleview;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.Toast;
import com.example.qing.myapplication2.R;
public class StaggeredGridAdapter extends RecyclerView.Adapter<StaggeredGridAdapter.LinearViewHolder> {
private Context mContext;
private OnItemClickListener mListener;
public StaggeredGridAdapter(Context context,OnItemClickListener listener){
this.mContext = context;
this.mListener = listener;
}
@Override
public LinearViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new LinearViewHolder(LayoutInflater.from(mContext).inflate(R.layout.layout_staggeredgrid_recycler_item,parent,false));
}
@Override
public void onBindViewHolder(LinearViewHolder holder, final int position) {
if(position%2==0)
holder.imageView.setImageResource(R.drawable.image1);
else
holder.imageView.setImageResource(R.drawable.image2);
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//Toast.makeText(mContext,"点击了第"+position+"项",Toast.LENGTH_SHORT).show();
mListener.onClick(position);
}
});
}
@Override
public int getItemCount() {
return 50;
}
class LinearViewHolder extends RecyclerView.ViewHolder{
private ImageView imageView;
public LinearViewHolder(View view){
super(view);
imageView = view.findViewById(R.id.iv);
}
}
public interface OnItemClickListener{
void onClick(int pos);
}
}
- 瀑布流效果图
RecycleView根据不同的ViewHolder,显示不一样
- 编辑 layout_linear_item2.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="wrap_content"
android:gravity="center"
android:background="@color/colorWhite">
<TextView
android:id="@+id/tv_title"
android:layout_width="match_parent"
android:layout_height="50dp"
android:gravity="center"
android:textColor="#000000"
android:textSize="20sp"/>
<ImageView
android:id="@+id/iv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/ic_launcher"/>
</LinearLayout>
- 修改前面的LinearAdapter.java即可
package com.example.qing.myapplication2.recycleview;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.example.qing.myapplication2.R;
import static android.R.attr.id;
public class LinearAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private Context mContext;
private OnItemClickListener mListener;
public LinearAdapter(Context context,OnItemClickListener listener){
this.mContext = context;
this.mListener = listener;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if(viewType==0)
return new LinearViewHolder(LayoutInflater.from(mContext).inflate(R.layout.layout_linear_item,parent,false));
else
return new LinearViewHolder2(LayoutInflater.from(mContext).inflate(R.layout.layout_linear_item2,parent,false));
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
if(getItemViewType(position)==0){
((LinearViewHolder)holder).textView.setText("Hello World");
}
else{
((LinearViewHolder2)holder).textView.setText("我还带有图片");
}
//为每一项添加点击事件
holder.itemView.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
Toast.makeText(mContext,"在里面LinearAdapter.java处理点击事件"+position+"项",Toast.LENGTH_SHORT).show();
//调用自定义的接口
mListener.onClick(position);
}
});
}
@Override
public int getItemViewType(int position) {
if(position%2==0)
return 0;
else
return 1;
}
@Override
public int getItemCount() {
return 30;
}
//定义一个holder
class LinearViewHolder extends RecyclerView.ViewHolder{
public TextView textView;
public LinearViewHolder(View itemView) {
super(itemView);
textView = (TextView) itemView.findViewById(R.id.tv_title);
}
}
class LinearViewHolder2 extends RecyclerView.ViewHolder{
public TextView textView;
public ImageView imageView;
public LinearViewHolder2(View itemView) {
super(itemView);
textView = (TextView) itemView.findViewById(R.id.tv_title);
imageView = itemView.findViewById(R.id.iv);
}
}
//定义一个接口
public interface OnItemClickListener{
void onClick(int pos);
}
}
- 不同的viewHolder的效果图
十二.WebView
- 先准备工作:
- 新建一个WebViewActivity, 系统会自动完成3个任务
- 编辑activity_web_view.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">
<WebView
android:id="@+id/wv"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</WebView>
</LinearLayout>
-
左侧栏新建一个assets文件夹
app\src\main下面右击, new->folder->Assets
然后复制一些html文件到里面去,比如hello.html -
先写一点代码,即可加载本地html文件了
//声明全局变量
private WebView webView;
//onCreate函数里面的代码
webView = (WebView) findViewById(R.id.wv);
//加载本地url
webView.loadUrl("file:///android_asset/hello.html");
//或者加载网页
//webView.loadUrl("https://taifua.com/");//注意提前声明联网权限哦
- 制作自定义的浏览器, 这3点必然要修改的
- 允许js代码
- 修改默认只能允许浏览一次网页
- 修改返回键
package com.example.qing.myapplication2;
import android.graphics.Bitmap;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.webkit.WebChromeClient;
import android.webkit.WebResourceRequest;
import android.webkit.WebView;
import android.webkit.WebViewClient;
public class WebViewActivity extends AppCompatActivity {
private WebView webView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_web_view);
webView = (WebView) findViewById(R.id.wv);
//加载本地url
//webView.loadUrl("file:///android_asset/hello.html");
//加载网页
//允许js代码
webView.getSettings().setJavaScriptEnabled(true);
//修改默认只能允许浏览一次网页
webView.setWebViewClient(new MyWebViewClient());
//修改返回键
webView.setWebChromeClient(new MyWebChromeClient());
webView.loadUrl("https://m.baidu.com");
}
//默认返回按键是关闭窗口,修改为网页回退
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode == KeyEvent.KEYCODE_BACK && webView.canGoBack()){
webView.goBack();
return true;
}
//默认是关闭窗口(当前Activity)
return super.onKeyDown(keyCode, event);
}
class MyWebViewClient extends WebViewClient{
//是否允许再一次浏览网页,默认只允许浏览一次网页
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
view.loadUrl(request.getUrl().toString());
return true;
}
//页面开始加载的函数
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
System.out.println("页面开始加载了");
}
//页面加载完成的函数
@Override
public void onPageFinished(WebView view, String url)
{
super.onPageFinished(view, url);
System.out.println("页面加载完成了");
//还可以弹出js提示框
//webView.loadUrl("javascript:alert('hello')");
//或者
//webView.evaluateJavascript("javascript:alert('hello')", null);
}
}
class MyWebChromeClient extends WebChromeClient{
//调整进度条的函数
@Override
public void onProgressChanged(WebView view, int newProgress) {
super.onProgressChanged(view, newProgress);
}
//设置标题
@Override
public void onReceivedTitle(WebView view, String title) {
super.onReceivedTitle(view, title);
//把当前页面的标题设为网页HTML的标题
setTitle(title);
}
}
}
十三.弹出组件Toast
- 基本用法
Toast.makeText(getApplicationContext(), "Toast", Toast.LENGTH_LONG).show();
- 修改弹窗的位置
Toast toastCenter = Toast.makeText(getApplicationContext(), "居中Toast", Toast.LENGTH_LONG);
toastCenter.setGravity(Gravity.CENTER, 0, 0);
toastCenter.show();
- 给Toast设定个性化的页面
Toast toastCustom = new Toast(getApplicationContext());
LayoutInflater inflater = LayoutInflater.from(ToastActivity.this);
View viewCustom = inflater.inflate(R.layout.layout_toast, null);
ImageView imageView = viewCustom.findViewById(R.id.iv_toast);
TextView textView = viewCustom.findViewById(R.id.tv_toast);
imageView.setImageResource(R.drawable.smile);
textView.setText("自定义Toast");
toastCustom.setView(viewCustom);
toastCustom.setDuration(Toast.LENGTH_LONG);
toastCustom.show();
- 自定义一个Toast类,弹窗更加方便
package com.taifua.androidlearning;
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);
else
mToast.setText(msg);
mToast.show();
}
}
十四. 弹出对话框
- 弹出是否对话框,代码
//弹出是否对话框
private void dialogYesOrNo(){
{
//导入v7包下面的,外观好看一点 import android.support.v7.app.AlertDialog;
AlertDialog.Builder builder = new AlertDialog.Builder(DialogActivity.this);
//还可以设置图标,可以不设置
builder.setIcon(R.drawable.icon_user);
//builder可以连续设置
builder.setTitle("请回答").setMessage("你觉得课程如何");
//设置正确的回答
builder.setPositiveButton("棒", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(DialogActivity.this, "你很诚实", Toast.LENGTH_SHORT).show();
}
});
//设置中性回答,可以不设置
builder.setNeutralButton("还行", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(DialogActivity.this, "你再瞅瞅", Toast.LENGTH_SHORT).show();
}
});
//设置否定回答
builder.setNegativeButton("不好", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(DialogActivity.this, "睁眼说假话", Toast.LENGTH_SHORT).show();
}
});
builder.show();
}
}
效果图
- 弹出单选对话框
//单选弹框
private void dialogRadio(){
final String[] arr = new String[] {"男","女","保密"};
AlertDialog.Builder builder = new AlertDialog.Builder(DialogActivity.this);
builder.setTitle("选择性别");
//设置单选的每一个项目
builder.setItems(arr, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(DialogActivity.this,arr[which],Toast.LENGTH_SHORT).show();
}
});
builder.show();
}
效果图
- 弹出单选对话框
private void dialogSingleChoice() {
final String[] arr = new String[]{"男", "女", "保密"};
final AlertDialog.Builder builder = new AlertDialog.Builder(DialogActivity.this);
builder.setTitle("选择性别");
//设置单选的每一个项目
builder.setSingleChoiceItems(arr, 0, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(DialogActivity.this, arr[which], Toast.LENGTH_SHORT).show();
dialog.dismiss(); //选好了,对话框就消失
}
});
//对话框不可以关闭,必选项
builder.setCancelable(false);
builder.show();
}
效果图
- 弹出多选对话框
//多选弹框
private void dialogMultiChoice(){
final String[] arr = new String[] {"唱歌","跳舞","写代码"};
boolean[] isChecked = new boolean[] {false,false,true};
final AlertDialog.Builder builder = new AlertDialog.Builder(DialogActivity.this);
builder.setTitle("选择兴趣");
//设置每一个项目
builder.setMultiChoiceItems(arr, isChecked, new DialogInterface.OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
Toast.makeText(DialogActivity.this,arr[which]+":"+isChecked,Toast.LENGTH_SHORT).show();
}
});
//添加确定和取消按钮
builder.setPositiveButton("确定", new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialogInterface, int i)
{
}
}).setNegativeButton("取消", new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialogInterface, int i)
{
}
});
builder.show();
}
效果图
- 弹出自定义对话框
private void dialogLayout(){
AlertDialog.Builder builder = new AlertDialog.Builder(DialogActivity.this);
//页面布局见layout_dialog.xml
View view = LayoutInflater.from(DialogActivity.this).inflate(R.layout.layout_dialog,null);
final EditText etUsername = view.findViewById(R.id.et_username);
final EditText etPassword = view.findViewById(R.id.et_password);
Button btnLogin = view.findViewById(R.id.btn_login);
//添加登录按钮点击事件
btnLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String str = "用户名是:"+etUsername.getText()+" 密码是:"+etPassword.getText();
Toast.makeText(DialogActivity.this,str,Toast.LENGTH_SHORT).show();
}
});
builder.setTitle("请先登录");
builder.setView(view);
builder.show();
}
效果图
十五. ProgressBar进度条
- 默认样式
<ProgressBar
android:id="@+id/pb1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
- 样式1
<ProgressBar
android:id="@+id/pb2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@android:style/Widget.ProgressBar"
android:layout_marginTop="10dp"
/>
- 样式2
<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="20"
android:secondaryProgress="50"
/>
<!--设置为20%,二级缓冲进度条50%-->
效果图
- 样式3
<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="20"
android:secondaryProgress="50"
效果图
- 给进度条增加递增的效果
package com.example.qing.myapplication2;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.Toast;
public class ProgressActivity extends AppCompatActivity {
private ProgressBar mPb;
private Button btn;
private Button mBtnprogressDialog1,getmBtnprogressDialog2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_progress);
mPb = (ProgressBar) findViewById(R.id.pb3);
mPb.setProgress(5); //设置进度条为5
btn = (Button) findViewById(R.id.btn_pb);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mPb.setProgress(5);
//点击按钮后发送一个消息
handler.sendEmptyMessage(0);
}
});
}
//处理这个消息
Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if(mPb.getProgress()<100){
handler.postDelayed(runnable,500); //延迟500ms让runnable来处理这个消息
}else{
Toast.makeText(ProgressActivity.this,"加载完成了!",Toast.LENGTH_SHORT).show();
}
}
};
//处理这个消息,给进度条+5
Runnable runnable = new Runnable() {
@Override
public void run() {
mPb.setProgress(mPb.getProgress()+5);
handler.sendEmptyMessage(0); //再处理这个消息
}
};
}
- 样式5-自定义图片
<ProgressBar
android:id="@+id/pb5"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@android:style/Widget.ProgressBar"
android:indeterminateDrawable="@drawable/bg_progress"
android:layout_marginTop="10dp"
/>
<!--android:indeterminateDrawable="@drawable/bg_progress" 动画效果-->
bg_progress.xml写入下面代码
<?xml version="1.0" encoding="utf-8"?>
<animated-rotate
xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/loading"
android:pivotX="50%"
android:pivotY="50%"
>
<!--背景图为loding.png-->
<!--旋转中心坐标为50%,50%-->
</animated-rotate>
效果图
- 样式6和样式5一样的效果
<!--pb6和pb5一样的效果,,需要style.xml配合-->
<ProgressBar
android:id="@+id/pb6"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@style/MyProgress"
android:layout_marginTop="10dp"
/>
style.xml写入下面代码
<!--配合pb6-->
<style name="MyProgress">
<item name="android:indeterminateDrawable">@drawable/bg_progress</item>
</style>
- 弹出圆圈型的进度条对话框
private Button mBtnprogressDialog1;
mBtnprogressDialog1 = (Button) findViewById(R.id.btn_progress_dialog1);
//圆圈型的进度条对话框
mBtnprogressDialog1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//弹出进度条对话框1
ProgressDialog progressDialog = new ProgressDialog(ProgressActivity.this);
progressDialog.setTitle("提示");
progressDialog.setMessage("正在加载");
//人为取消的监听事件
progressDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
Toast.makeText(ProgressActivity.this,"人为取消了",Toast.LENGTH_SHORT).show();
}
});
//自动取消的监听事件
progressDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
Toast.makeText(ProgressActivity.this,"自动取消了",Toast.LENGTH_SHORT).show();
}
});
progressDialog.setCancelable(false); //不可以点击空白位置来取消
//添加积极的按钮,同理可以添加中性按钮,消极的按钮
progressDialog.setButton(DialogInterface.BUTTON_POSITIVE, "好", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(ProgressActivity.this,"好",Toast.LENGTH_SHORT).show();
}
});
progressDialog.show();
}
});
效果图
- 弹出水平的进度条对话框
//进度条类型的进度条对话框
mBtnprogressDialog2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ProgressDialog progressDialog = new ProgressDialog(ProgressActivity.this);
//设置水平的
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressDialog.setTitle("提示");
progressDialog.setMessage("正在加载");
progressDialog.show();
}
});
效果图
十六.自定义对话框
十七.PopupWindow弹出下拉菜单
不常用
十八. Activity之间传递参数
- 最简洁的方法
传递方:
Intent intent = new Intent(MainActivity.this,MyDetailsActivity.class);
intent.putExtra("id", id);
startActivity(intent);
接受方:
public String id;
id = getIntent().getStringExtra("id");
- 其他方法:
传递参数代码:
接受代码:
十八.Fragment
- 新建一个Activity,名叫ContainerActivity,系统会自动完成3个任务
- 编辑ContainerActivity.java
package com.taifua.androidlearning.fragment;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import com.taifua.androidlearning.R;
public class ContainerActivity extends AppCompatActivity {
private AFragment aFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_container);
aFragment = new AFragment();
//把aFragment添加到activity中, commitAllowingStateLoss宽容一些错误
getFragmentManager().beginTransaction().add(R.id.f1_container,aFragment).commitAllowingStateLoss();
}
}
- 编辑activity_container.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".fragment.ContainerActivity">
<Button
android:id="@+id/btn_change"
android:layout_width="match_parent"
android:layout_height="50dp"
android:text="更换到BFragment"/>
<!--下面显示fragment内容-->
<FrameLayout
android:id="@+id/f1_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/btn_change">
</FrameLayout>
</RelativeLayout>
- 新建fragment_a.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="20dp"
>
<TextView
android:id="@+id/tv1_fragmentA"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="我是A Fragment"/>
</LinearLayout>
- 新建 AFragment.java
package com.taifua.androidlearning.fragment;
import android.app.Fragment;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.taifua.androidlearning.R;
public class AFragment extends Fragment {
private TextView mTvTittle;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
//AFragment对应着fragment_a.xml
View view = inflater.inflate(R.layout.fragment_a,container,false);
return view;
}
@Nullable
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
//也要相应的修改
mTvTittle = view.findViewById(R.id.tv1_fragmentA);
}
}
-
上面的代码实现了一打开ContainerActivity就自动加载了AFragment的内容, 效果图:
-
为了实现点击按钮切换到BFragment的效果
-
新建一个fragment_b.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="20dp"
>
<TextView
android:id="@+id/tv1_fragmentB"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="我是B Fragment"/>
</LinearLayout>
- 新建一个BFragment.java,注意复制前面的AFragment.java需要相应的修改内容
package com.taifua.androidlearning.fragment;
import android.app.Fragment;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.taifua.androidlearning.R;
public class BFragment extends Fragment {
private TextView mTvTittle;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
//AFragment对应着fragment_a.xml
View view = inflater.inflate(R.layout.fragment_b,container,false);
return view;
}
@Nullable
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
//也要相应的修改
mTvTittle = view.findViewById(R.id.tv1_fragmentB);
}
}
- 编辑ContainerActivity.java,添加一些代码
//全局声明
private BFragment bFragment;
private Button mBtnChange;
//添加到onCreate函数中
//点击按钮,就切换到bFragment
mBtnChange = findViewById(R.id.btn_change);
mBtnChange.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(bFragment== null){
bFragment = new BFragment();
}
//切换到bFragment的代码
getFragmentManager().beginTransaction().replace(R.id.f1_container,bFragment).commitAllowingStateLoss();
}
});
附上ContainerActivity.java全部的代码:
package com.taifua.androidlearning.fragment;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import com.taifua.androidlearning.R;
public class ContainerActivity extends AppCompatActivity {
private AFragment aFragment;
private BFragment bFragment;
private Button mBtnChange;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_container);
aFragment = new AFragment();
//把aFragment添加到activity中, commitAllowingStateLoss宽容一些错误
getFragmentManager().beginTransaction().add(R.id.f1_container,aFragment).commitAllowingStateLoss();
//点击按钮,就切换到bFragment
mBtnChange = findViewById(R.id.btn_change);
mBtnChange.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(bFragment== null){
bFragment = new BFragment();
}
//切换到bFragment的代码
getFragmentManager().beginTransaction().replace(R.id.f1_container,bFragment).commitAllowingStateLoss();
}
});
}
}
- 效果图
传递参数的Fragment
- 编辑activity_container.xml添加一个按钮,
<Button
android:id="@+id/btn_change2"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_below="@+id/btn_change"
android:text="更换带有参数的BFragment"/>
<!--下面显示fragment内容-->
<FrameLayout
android:id="@+id/f1_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/btn_change2">
</FrameLayout>
<!--android:layout_below="@+id/btn_change2">这里也要修改,要不然看内容被按钮挡住了-->
- 编辑ContainerActivity.java
//点击按钮切换到带有参数的BFragment
mBtnChange2 = findViewById(R.id.btn_change2);
mBtnChange2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
bFragment = BFragment.newInstance("Hello");
getFragmentManager().beginTransaction().replace(R.id.f1_container,bFragment).commitAllowingStateLoss();
}
});
- 编辑BFragment.java,那个fragment_b.xml不需要动
package com.taifua.androidlearning.fragment;
import android.app.Fragment;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.taifua.androidlearning.R;
public class BFragment extends Fragment {
private TextView mTvTittle;
//用来传递参数,传递title
public static BFragment newInstance(String title) {
BFragment fragment = new BFragment();
Bundle bundle = new Bundle();
bundle.putString("title",title);
fragment.setArguments(bundle);
return fragment;
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
//AFragment对应着fragment_a.xml
View view = inflater.inflate(R.layout.fragment_b,container,false);
return view;
}
@Nullable
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
//也要相应的修改
mTvTittle = view.findViewById(R.id.tv1_fragmentB);
Bundle bundle = getArguments();
if(bundle!=null){
String title = bundle.getString("title");
mTvTittle.setText("传递过来的参数是"+title);
}
}
}
- 效果图
fragment回收站机制
十九. BottomNavigationView实现底部导航栏
https://blog.csdn.net/yinzhijiezhan/article/details/77854360
二十. handler
安卓主线程不可以联网, 子线程不可以更改UI界面
- 想要联网,需要开启子线程去联网,代码如下
//这句代码放在全局变量
Runnable runnable = new Runnable() {
@Override
public void run() {
//联网,连接数据库
}
}; //结尾加上分号
//调用上面的代码,开另一个线程
new Thread(runnable).start();
- 子线程想要修改UI界面,使用Handler,代码如下
package com.taifua.androidlearning;
import android.content.Intent;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
public class HandlerActivity extends AppCompatActivity {
private Handler myHandler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_handler_acitivity);
myHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
switch (msg.what){
case 1:
System.out.println("11111================");
//跳转到新界面
Intent intent = new Intent(HandlerActivity.this,MainActivity.class);
startActivity(intent);
break;
}
}
};
//开另一个线程
new Thread(runnable).start();
}
Runnable runnable = new Runnable() {
@Override
public void run() {
//线程中修改UI,必须要使用Handler
// Message msg = new Message();
// msg.what = 1;
// myHandler.sendMessage(msg);
//上面3句代码等同于下面一句代码,更加简洁
myHandler.sendEmptyMessage(1);
}
};
}
- 使用Handler延迟的效果
package com.taifua.androidlearning;
import android.content.Intent;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
public class HandlerActivity extends AppCompatActivity {
private Handler myHandler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_handler_acitivity);
//延迟3秒的效果
myHandler = new Handler();
myHandler.postDelayed(runnable,3000);
}
Runnable runnable = new Runnable() {
@Override
public void run() {
//跳转到其他界面
Intent intent = new Intent(HandlerActivity.this,MainActivity.class);
startActivity(intent);
}
};
}