设计目标:
设计包含四个tab页面的app
功能说明:
通过AS编写代码实现该程序
代码解析:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:background="@color/black" android:layout_height="match_parent"> <TextView android:id="@+id/Textview" android:layout_width="wrap_content" android:layout_height="80dp" android:layout_weight="1" android:gravity="center" android:text="Gcy Wechat" android:textColor="@color/white" android:textSize="30sp"></TextView>
</LinearLayout>
<LinearLayout
android:id="@+id/LinearLayout_wechat"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center"
android:orientation="vertical">
<ImageView
android:id="@+id/imageView1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:src="@drawable/wechat2" />
<TextView
android:id="@+id/textView1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="微信"
android:textColor="@color/white"
android:textSize="25sp" />
</LinearLayout>
private FragmentManager fragmentManager;
private void initFragment(){
fragmentManager=getFragmentManager();
FragmentTransaction transaction=fragmentManager.beginTransaction(); //开始交互控制
transaction.add(R.id.id_content,wechatFragment); //把fragment加入到id_content
transaction.add(R.id.id_content,friendFragment);
transaction.add(R.id.id_content,contactFragment);
transaction.add(R.id.id_content,configFragment);
transaction.commit();
}
package com.example.mywork;
import android.os.Bundle;
import android.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class wechatFragment extends Fragment {
public wechatFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
// 压缩器,把xml文件压缩到容器中
return inflater.inflate(R.layout.fragment_wechat, container, false);
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".wechatFragment">
<!-- TODO: Update blank fragment layout -->
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="这是微信聊天界面"
android:textSize="30dp"
android:gravity="center"/>
</LinearLayout>
private void changeColor(int i){
imageView1.setImageResource(R.drawable.wechat2);
imageView2.setImageResource(R.drawable.friend2);
imageView3.setImageResource(R.drawable.contact2);
imageView4.setImageResource(R.drawable.config2);
textView1.setTextColor(Color.rgb(255, 255, 255));
textView2.setTextColor(Color.rgb(255, 255, 255));
textView3.setTextColor(Color.rgb(255, 255, 255));
textView4.setTextColor(Color.rgb(255, 255, 255));
switch (i){
case 0:
imageView1.setImageResource(R.drawable.wechat1);
textView1.setTextColor(Color.rgb(26,250,41));
break;
case 1:
imageView2.setImageResource(R.drawable.friend1);
textView2.setTextColor(Color.rgb(26,250,41));
break;
case 2:
imageView3.setImageResource(R.drawable.contact1);
textView3.setTextColor(Color.rgb(26,250,41));
break;
case 3:
imageView4.setImageResource(R.drawable.config1);
textView4.setTextColor(Color.rgb(26,250,41));
break;
default:
break;
}
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.LinearLayout_wechat:
changeColor(0);
showfragment(0);
break;
case R.id.LinearLayout_friend:
changeColor(1);
showfragment(1);
break;
case R.id.LinearLayout_contact:
changeColor(2);
showfragment(2);
break;
case R.id.LinearLayout_config:
changeColor(3);
showfragment(3);
break;
default:
break;
}
}
private void initFragment(){
fragmentManager=getFragmentManager();
FragmentTransaction transaction=fragmentManager.beginTransaction(); //开始交互控制
transaction.add(R.id.id_content,wechatFragment); //把fragment加入到id_content
transaction.add(R.id.id_content,friendFragment);
transaction.add(R.id.id_content,contactFragment);
transaction.add(R.id.id_content,configFragment);
//隐藏4个tag
hideFragment(transaction);
//或者 changeColor(0);showfragment(0); 显示微信聊天页面
transaction.commit();
}
1.
在 Adapter 里面直接对控件做点击事件
@Override
public void onBindViewHolder(@NonNull XxxViewHolder holder, int position) {
holder.控件名.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO:
}
});
}
在 Adapter 里写接口
public interface OnItemClickListener {
void onItemClick(参数类型 参数名 , ...);
}
private OnItemClickListener mListener;
public XxxAdapter(Context context, OnItemClickListener listener) {
mContext = context;
mListener = listener;
}
@Override
public void onBindViewHolder(@NonNull XxxViewHolder holder, int position) {
holder.控件名.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mListener.onItemClick(content);
}
});
}
在 Activity 或 Fragment 上实现接口中定义的方法
public class XxxActivity extends AppCompatActivity implements XxxAdapter.OnItemClickListener
XxxAdapter adapter = new XxxAdapter(context, this);
@Override
public void onItemClick(String content) {
// TODO:
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
activity_main1.xml
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="50dp"
xmlns:tools="http://schemas.android.com/tools"
android:layout_margin="8dp"
android:background="@drawable/common_bg"
android:orientation="vertical">
<TextView
android:id="@+id/textView1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginLeft="8dp"
android:gravity="center"
android:text="TextView" />
</LinearLayout>
activity_main2.xml
<?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"
android:gravity="center"
android:orientation="vertical"
tools:context=".MainActivity2">
<TextView
android:id="@+id/textView7"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:text="这是第一个activity"
android:textSize="40sp" />
</LinearLayout>
activity_main3.xml
<?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=".MainActivity3">
<TextView
android:id="@+id/textView5"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:text="新闻详情"
android:textSize="40dp" />
</LinearLayout>
新闻列表
ackage com.example.myworkgwl01;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.app.Fragment;
import com.example.myworkgwl01.Myadapter;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.ItemTouchHelper;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
import java.util.List;
public class contactFragment extends Fragment {
private RecyclerView recyclerView;
private Myadapter myadapter;
private List<String> list = new ArrayList<>();
private Context context;
public contactFragment() {
// Required empty public constructor
}
private void initData(){
for(int i=0;i<30;i++) {
list.add("最新新闻" + i );
}
}
private void initView3(){
context=this.getActivity();
myadapter=new Myadapter(list,context);
LinearLayoutManager manager3=new LinearLayoutManager(context);
manager3.setOrientation(LinearLayoutManager.VERTICAL);
recyclerView.setAdapter(myadapter);
recyclerView.setLayoutManager(manager3);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
// return inflater.inflate(R.layout.contact, container, false);
View view = inflater.inflate(R.layout.contact, container, false);
recyclerView=view.findViewById(R.id.recycleview);
initData();
initView3();
return view;
}
}
Mainactivity2
package com.example.myworkgwl01;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.RecyclerView;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
public class MainActivity2 extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(resultCode==31){
String state=data.getStringExtra("state");
Log.d("life",state);
}
}
@Override
protected void onStart() {
super.onStart();
Log.d("life","activity1 is onStart...");
}
@Override
protected void onPostResume() {
super.onPostResume();
Log.d("life","activity1 is onPostResume...");
}
@Override
protected void onRestart() {
super.onRestart();
Log.d("life","activity1 is onReStart...");
}
@Override
protected void onPause() {
super.onPause();
Log.d("life","activity1 is onPause...");
}
@Override
protected void onStop() {
super.onStop();
Log.d("life","activity1 is onStop...");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d("life","activity1 is onDestroy...");
}
@Override
public void finish() {
super.finish();
Log.d("life","activity1 is finish...");
}
@Override
public void finishActivity(int requestCode) {
super.finishActivity(requestCode);
Log.d("life","activity1 is finishActivity...");
}
}
Mainactivity3
package com.example.myworkgwl01;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
public class MainActivity3 extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main3);
}
@Override
protected void onPostResume() {
super.onPostResume();
Log.d("life", "activity2 is onPostResume...");
}
@Override
protected void onStart() {
super.onStart();
Log.d("life", "activity2 is onStart...");
}
@Override
protected void onRestart() {
super.onRestart();
Log.d("life", "activity2 is onReStart...");
}
@Override
protected void onStop() {
super.onStop();
Log.d("life", "activity2 is onStop...");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d("life", "activity2 is onDestroy...");
}
@Override
protected void onPause() {
super.onPause();
Log.d("life", "activity2 is onPause...");
}
@Override
public void finish() {
super.finish();
Log.d("life", "activity2 is finish...");
}
@Override
public void finishActivity(int requestCode) {
super.finishActivity(requestCode);
Log.d("life", "activity2 is finishActivity...");
}
}
2.
public class MainActivity extends Activity {
private final static String TAG="MainActivity";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btnOpen=(Button)this.findViewById(R.id.btnOpen);
btnOpen.setOnClickListener(new View.OnClickListener(){
public void onClick(View v) {
//第二个参数为请求码,可以根据业务需求自己编号
startActivityForResult(new Intent(MainActivity.this, OtherActivity.class), 1);
}
});
}
/**
* 为了得到传回的数据,必须在前面的Activity中(指MainActivity类)重写onActivityResult方法
*
* requestCode 请求码,即调用startActivityForResult()传递过去的值
* resultCode 结果码,结果码用于标识返回数据来自哪个新Activity
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
String result = data.getExtras().getString("result");//得到新Activity 关闭后返回的数据
Log.i(TAG, result);
}
}
public class OtherActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.other);
Button btnClose=(Button)findViewById(R.id.btnClose);
btnClose.setOnClickListener(new View.OnClickListener(){
public void onClick(View v) {
//数据是使用Intent返回
Intent intent = new Intent();
//把返回数据存入Intent
intent.putExtra("result", "My name is linjiqin");
//设置返回数据
OtherActivity.this.setResult(RESULT_OK, intent);
//关闭Activity
OtherActivity.this.finish();
}
});
}
}
注册provider:
<provider
android:name=".MyContentProvider"
android:authorities="com.example.mycontentprovider.mycontentprovider" //唯一标识
android:enabled="true"
android:exported="true"/>
provider获取数据:
public static void getContactsInfo(Context context) {
//1. 获取内容解析者
ContentResolver contentResolver = context.getContentResolver();
// ContactsContract 联系人的API
Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
String[] projection = new String[]{
ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
ContactsContract.CommonDataKinds.Phone.NUMBER,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID
};
//2.查询操作
//uri :查询地址
//projection :查询的数据字段名称
//selection :查询的条件 where id=..
//selectionArgs :查询条件的参数
//sortOrder :排序s
// contentResolver.query(uri, projection, selection, selectionArgs, sortOrder);
Cursor cursor = contentResolver.query(uri, projection, null, null, null);
while (cursor.moveToNext()) {
String name = cursor.getString(0);
String number = cursor.getString(1);
int id = cursor.getInt(2);
Bitmap bitmap = getContactPhoto(context, id);
if (null == bitmap) {
Log.e("Contact", "id: " + id + " 头像不为空");
} else {
Log.e("Contact", "id: " + id + " 头像为空");
}
}
}
public static Bitmap getContactPhoto(Context context, int id) {
ContentResolver contentResolver = context.getContentResolver();
// Uri uri = ContactsContract.Contacts.CONTENT_URI;
//拼接路径
//http://www.baidu.com/jdk
//参数一:表的路径
//参数二:联系人具体的路径
Uri uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_URI, id + "");
//获取联系人头像,以流的方式返回
InputStream is = ContactsContract.Contacts.openContactPhotoInputStream(contentResolver, uri);
Bitmap bitmap = BitmapFactory.decodeStream(is);
if (is != null) {
try {
is.close();
is = null;
} catch (IOException e) {
e.printStackTrace();
}
}
return bitmap;
}
Resolver调用:
ContentResolver resolver = context.getContentResolver();
resolver.delete(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
MediaStore.Images.Media.DISPLAY_NAME + "='" + originFileName + "." + photo.extensionName + "'",
null
);
仓库地址: