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最简洁的写法

  1. 建立一个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>
  1. 再建立一个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));
        }
    }
}

  1. 新建一个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("标题是:");
        }
    }

}

外接点击事件写法

  1. 再新建一个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方法,在加载每一项之后添加装饰
    }
}

  1. 新建一个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);
    }
}

  1. 使用代码
<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>
  1. 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>
  1. values下面新建dimens.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <dimen name="dividerHight">1dp</dimen>
</resources>
  1. 效果图
    Android学习笔记(二)

RecycleView实现水平方向滚动

  1. 编辑 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>

  1. 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>
  1. 编辑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);
        }
    }
}

  1. 新建一个监听器类,名为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);
    }
}

  1. 最后注意细节地方,有的地方可能引用其他参数,别忘了AndroidManifest.xml中声明,联网权限等等

RecycleView实现网格视图

  1. 准备工作:activity_recycle_view.xml中添加一个按钮,并且在RecycleViewActivity中添加点击事件,点击跳转到GridRecycleViewActivity页面
  2. 新建一个Activity,名为GridRecycleViewActivity,系统会自动完成3个任务
  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>
  1. 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>
  1. 编辑GridRecycleViewActivity,java
    首先获取id为rv_grid的RecyclerView
    然后添加布局管理器,注意是GridLayoutManager不是LinearLayoutManager
    rv_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);
        }
    }
}

  1. 新建一个监听器类,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);
    }
}

  1. 效果图
    Android学习笔记(二)

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>

  1. 编辑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>
  1. 编辑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);
        }
    }
}
  1. 编辑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);
    }
}
  1. 瀑布流效果图
    Android学习笔记(二)

RecycleView根据不同的ViewHolder,显示不一样

  1. 编辑 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>
  1. 修改前面的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);
    }
}

  1. 不同的viewHolder的效果图
    Android学习笔记(二)

十二.WebView

  1. 先准备工作:
  2. 新建一个WebViewActivity, 系统会自动完成3个任务
  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>
  1. 左侧栏新建一个assets文件夹
    app\src\main下面右击, new->folder->Assets
    然后复制一些html文件到里面去,比如hello.html

  2. 先写一点代码,即可加载本地html文件了

//声明全局变量
	private WebView webView;
	
//onCreate函数里面的代码
    webView = (WebView) findViewById(R.id.wv);
	//加载本地url
    webView.loadUrl("file:///android_asset/hello.html");

	//或者加载网页
    //webView.loadUrl("https://taifua.com/");//注意提前声明联网权限哦

  1. 制作自定义的浏览器, 这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

  1. 基本用法
Toast.makeText(getApplicationContext(), "Toast", Toast.LENGTH_LONG).show();
  1. 修改弹窗的位置
Toast toastCenter = Toast.makeText(getApplicationContext(), "居中Toast", Toast.LENGTH_LONG);
toastCenter.setGravity(Gravity.CENTER, 0, 0);
toastCenter.show();
  1. 给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();
  1. 自定义一个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();
    }
}

十四. 弹出对话框

  1. 弹出是否对话框,代码
//弹出是否对话框
        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();
            }
        }

效果图
Android学习笔记(二)

  1. 弹出单选对话框
//单选弹框
        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();
        }

效果图
Android学习笔记(二)

  1. 弹出单选对话框
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();
        }

效果图
Android学习笔记(二)

  1. 弹出多选对话框
//多选弹框
        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();
        }

效果图
Android学习笔记(二)

  1. 弹出自定义对话框
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();
        }

效果图

Android学习笔记(二)

十五. 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%-->

效果图
Android学习笔记(二)

  • 样式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"

效果图
Android学习笔记(二)

  • 给进度条增加递增的效果
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>

效果图
Android学习笔记(二)

  • 样式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();
            }
        });

效果图
Android学习笔记(二)

  • 弹出水平的进度条对话框
//进度条类型的进度条对话框
        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();
            }
        });

效果图
Android学习笔记(二)

十六.自定义对话框

十七.PopupWindow弹出下拉菜单

不常用

十八. Activity之间传递参数

  1. 最简洁的方法

传递方:

Intent intent = new Intent(MainActivity.this,MyDetailsActivity.class);
intent.putExtra("id", id);
startActivity(intent);

接受方:

public String id;
id = getIntent().getStringExtra("id");
  1. 其他方法:

传递参数代码:
Android学习笔记(二)
接受代码:
Android学习笔记(二)

十八.Fragment

  1. 新建一个Activity,名叫ContainerActivity,系统会自动完成3个任务
  2. 编辑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();

    }
}

  1. 编辑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>
  1. 新建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>
  1. 新建 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);
    }
}

  1. 上面的代码实现了一打开ContainerActivity就自动加载了AFragment的内容, 效果图:
    Android学习笔记(二)

  2. 为了实现点击按钮切换到BFragment的效果

  3. 新建一个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>
  1. 新建一个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);
    }
}

  1. 编辑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();

            }
        });
    }
}


  1. 效果图
    Android学习笔记(二)

传递参数的Fragment

  1. 编辑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">这里也要修改,要不然看内容被按钮挡住了-->

  1. 编辑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();
            }
        });
  1. 编辑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);
        }
    }
}
  1. 效果图
    Android学习笔记(二)

fragment回收站机制

Android学习笔记(二)

十九. BottomNavigationView实现底部导航栏

https://blog.csdn.net/yinzhijiezhan/article/details/77854360

二十. handler

安卓主线程不可以联网, 子线程不可以更改UI界面

  1. 想要联网,需要开启子线程去联网,代码如下
//这句代码放在全局变量
Runnable runnable = new Runnable() {
        @Override
        public void run() {
        	//联网,连接数据库
        }
};  //结尾加上分号
//调用上面的代码,开另一个线程
new Thread(runnable).start();
  1. 子线程想要修改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);

        }
    };
}

  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);
        }
    };
}