实例1:Android布局基本概念
在Android编程中,布局是构建用户界面(UI)的基础。以下是一个简单的线性布局(LinearLayout)的实例:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="按钮1"/>
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="按钮2"/>
</LinearLayout>
这个布局中包含了两个按钮,它们将会按照垂直方向排列。
实例2:在Activity中设置布局
在Activity中设置布局,需要在setContentView()方法中指定布局资源:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
这里的R.layout.activity_main指的是activity_main.xml布局文件的资源ID。
实例3:Android四大组件之Activity生命周期
Activity生命周期是Android开发者必须掌握的知识点。以下是一个Activity生命周期方法的简单示例:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
protected void onStart() {
super.onStart();
// Activity可见
}
@Override
protected void onResume() {
super.onResume();
// Activity获得焦点
}
@Override
protected void onPause() {
super.onPause();
// Activity失去焦点
}
@Override
protected void onStop() {
super.onStop();
// Activity不可见
}
@Override
protected void onDestroy() {
super.onDestroy();
// Activity销毁
}
}
实例4:Intent传递数据
Intent在Android中用于在组件之间传递消息和数据。以下是一个简单的Intent传递字符串数据的实例:
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
intent.putExtra("key", "Hello World!");
startActivity(intent);
在SecondActivity中,你可以通过以下方式获取传递的数据:
String message = getIntent().getStringExtra("key");
实例5:使用SharedPreferences存储数据
SharedPreferences是Android提供的一种轻量级存储方式,可以用来存储简单的键值对数据。以下是一个使用SharedPreferences存储和读取字符串数据的实例:
// 存储数据
SharedPreferences sharedPreferences = getSharedPreferences("MyApp", MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString("key", "Hello World!");
editor.apply();
// 读取数据
String value = sharedPreferences.getString("key", "default value");
实例6:使用数据库存储数据
Android提供了SQLite数据库的支持,以下是一个使用SQLite存储和读取数据的简单示例:
// 创建数据库
SQLiteDatabase database = SQLiteDatabase.openOrCreateDatabase("/data/data/your.package.name/databases/mydatabase.db", null);
// 创建表
String CREATE_TABLE = "CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT);";
database.execSQL(CREATE_TABLE);
// 插入数据
ContentValues values = new ContentValues();
values.put("name", "John Doe");
database.insert("users", null, values);
// 查询数据
Cursor cursor = database.query("users", new String[]{"id", "name"}, "id = ?", new String[]{String.valueOf(1)}, null, null, null);
while (cursor.moveToNext()) {
int id = cursor.getInt(0);
String name = cursor.getString(1);
// 处理数据
}
cursor.close();
// 删除数据
database.delete("users", "id = ?", new String[]{String.valueOf(1)});
// 关闭数据库
database.close();
实例7:使用RecyclerView展示列表数据
RecyclerView是Android 6.0引入的一个高性能的视图组,用于展示列表数据。以下是一个使用RecyclerView的简单示例:
// 设置布局管理器
RecyclerView recyclerView = findViewById(R.id.recyclerView);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
// 设置适配器
recyclerView.setAdapter(new MyAdapter(data));
// MyAdapter类
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
private List<String> mData;
public MyAdapter(List<String> data) {
mData = data;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
// 创建视图
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
// 绑定数据
holder.textView.setText(mData.get(position));
}
@Override
public int getItemCount() {
return mData.size();
}
public static class ViewHolder extends RecyclerView.ViewHolder {
TextView textView;
public ViewHolder(View itemView) {
super(itemView);
textView = itemView.findViewById(R.id.textView);
}
}
}
实例8:使用FloatingActionButton实现悬浮按钮
FloatingActionButton是一种可以悬浮在界面上的按钮,常用于导航栏。以下是一个实现FloatingActionButton的示例:
<FloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|end"
android:layout_margin="16dp"
android:src="@drawable/ic_add"
app:layout_anchor="@id/navigationView"
app:layout_anchorGravity="bottom|end" />
<androidx.drawerlayout.widget.DrawerLayout
android:id="@+id/drawerLayout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.google.android.material.navigation.NavigationView
android:id="@+id/navigationView"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start" />
<FrameLayout
android:id="@+id/contentFrame"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</androidx.drawerlayout.widget.DrawerLayout>
在MainActivity中,你可以通过以下方式获取FloatingActionButton的实例:
FloatingActionButton fab = findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// 处理点击事件
}
});
实例9:使用ViewPager实现滑动界面
ViewPager是一种可以滑动切换界面的组件,常用于实现滑动菜单。以下是一个使用ViewPager的简单示例:
<androidx.viewpager.widget.ViewPager
android:id="@+id/viewPager"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
在MainActivity中,你可以通过以下方式获取ViewPager的实例:
ViewPager viewPager = findViewById(R.id.viewPager);
viewPager.setAdapter(new MyPagerAdapter(getSupportFragmentManager()));
MyPagerAdapter是一个适配器类,用于管理ViewPager的界面。
实例10:使用Fragment管理界面
Fragment是Android中用于构建可重用界面组件的一种方式,可以与Activity协同工作。以下是一个使用Fragment的简单示例:
<FrameLayout
android:id="@+id/contentFrame"
android:layout_width="match_parent"
android:layout_height="match_parent" />
在MainActivity中,你可以通过以下方式添加Fragment:
Fragment fragment = new MyFragment();
getSupportFragmentManager().beginTransaction().add(R.id.contentFrame, fragment).commit();
MyFragment是一个Fragment类,用于定义界面。
实例11:使用RecyclerView实现下拉刷新
RecyclerView支持下拉刷新功能,以下是一个实现下拉刷新的简单示例:
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
android:id="@+id/refreshLayout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
在MainActivity中,你可以通过以下方式监听下拉刷新事件:
SwipeRefreshLayout refreshLayout = findViewById(R.id.refreshLayout);
refreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
// 处理下拉刷新事件
}
});
实例12:使用MaterialDesign库实现界面样式
MaterialDesign是Google提出的一套设计规范,包括了一系列的UI组件和样式。以下是一个使用MaterialDesign库的简单示例:
<com.google.android.material.card.MaterialCardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:cardCornerRadius="8dp">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="16dp"
android:text="这是一个MaterialDesign卡片"
android:textColor="@color/colorPrimary" />
</com.google.android.material.card.MaterialCardView>
在styles.xml文件中,你可以定义主题和颜色:
<style name="Theme.MyApp" parent="Theme.AppCompat.Light.NoActionBar">
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
实例13:使用Google Maps API显示地图
Google Maps API是Google提供的一项服务,可以让你在Android应用中集成地图功能。以下是一个使用Google Maps API显示地图的简单示例:
<fragment
android:id="@+id/mapFragment"
android:name="com.google.android.gms.maps.SupportMapFragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|end"
android:layout_margin="16dp"
android:src="@drawable/ic_my_location"
app:layout_anchor="@id/mapFragment"
app:layout_anchorGravity="bottom|end" />
在MainActivity中,你可以通过以下方式获取地图实例:
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.mapFragment);
mapFragment.getMapAsync(new OnMapReadyCallback() {
@Override
public void onMapReady(GoogleMap googleMap) {
// 处理地图加载完成事件
}
});
实例14:使用Firebase实现实时数据同步
Firebase是Google提供的一套后端云服务,可以用于实现实时数据同步。以下是一个使用Firebase的简单示例:
<fragment
android:id="@+id/firebaseFragment"
android:name="com.google.firebase.database.DatabaseReferenceFragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
在MainActivity中,你可以通过以下方式获取Firebase数据库实例:
FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference myRef = database.getReference("path/to/my/data");
myRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
// 处理数据变化
}
@Override
public void onCancelled(DatabaseError databaseError) {
// 处理数据同步失败
}
});
实例15:使用Google Sign-In实现账号登录
Google Sign-In是Google提供的一项服务,可以让你在Android应用中实现账号登录功能。以下是一个使用Google Sign-In的简单示例:
<com.google.android.gms.common.SignInButton
android:id="@+id/signInButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_margin="16dp"
android:theme="@style/ThemeOverlay.GmsCore.Light"
app:buttonSize="large"
app:clickable="true"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
在MainActivity中,你可以通过以下方式实现账号登录:
GoogleSignInClient mGoogleSignInClient = GoogleSignIn.getClient(this, GoogleSignInOptions.DEFAULT_SIGN_IN);
GoogleSignInAccount account = GoogleSignIn.getLastSignedInAccount(this);
if (account != null) {
// 已登录
} else {
// 未登录,启动登录流程
Intent signInIntent = mGoogleSignInClient.getSignInIntent();
startActivityForResult(signInIntent, RC_SIGN_IN);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == RC_SIGN_IN) {
GoogleSignInResult result = GoogleSignIn.getSignedInAccountFromIntent(data);
if (result.isSuccess()) {
// 获取Google账户信息
} else {
// 登录失败
}
}
}
实例16:使用RecyclerView实现网格布局
RecyclerView支持多种布局方式,其中包括网格布局。以下是一个使用RecyclerView实现网格布局的简单示例:
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"
app:spanCount="2" />
在MyAdapter类中,你需要重写onCreateViewHolder和onBindViewHolder方法,以便为网格布局提供适当的视图和绑定数据。
实例17:使用RecyclerView实现瀑布流布局
瀑布流布局是一种常见的布局方式,可以用于展示图片、商品列表等。以下是一个使用RecyclerView实现瀑布流布局的简单示例:
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layoutManager="com.your.package name.YourLayoutManager" />
在YourLayoutManager类中,你需要实现LayoutManager接口,并重写相关方法以支持瀑布流布局。
实例18:使用ViewPager2实现多页面滑动
ViewPager2是ViewPager的升级版本,提供了更好的性能和更丰富的功能。以下是一个使用ViewPager2实现多页面滑动的简单示例:
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/viewPager2"
android:layout_width="match_parent"
android:layout_height="match_parent" />
在MainActivity中,你可以通过以下方式获取ViewPager2的实例:
ViewPager2 viewPager2 = findViewById(R.id.viewPager2);
viewPager2.setAdapter(new MyPagerAdapter(getSupportFragmentManager()));
MyPagerAdapter是一个适配器类,用于管理ViewPager2的界面。
实例19:使用FragmentTransaction替换Fragment
FragmentTransaction用于在Activity中添加、删除或替换Fragment。以下是一个使用FragmentTransaction替换Fragment的简单示例:
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.contentFrame, new MyFragment());
transaction.commit();
实例20:使用FragmentStatePagerAdapter实现预加载
FragmentStatePagerAdapter可以预加载Fragment,提高滑动性能。以下是一个使用FragmentStatePagerAdapter的简单示例:
MyPagerAdapter adapter = new MyPagerAdapter(getSupportFragmentManager());
viewPager2.setAdapter(adapter);
MyPagerAdapter是一个适配器类,继承自FragmentStatePagerAdapter。
实例21:使用FragmentArgs传递参数
FragmentArgs是Android Jetpack组件库中提供的一种传递参数的方式。以下是一个使用FragmentArgs传递参数的简单示例:
<fragment
android:id="@+id/fragment"
android:name="com.your.package name.MyFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:arg_name="key" />
在MyFragment类中,你可以通过以下方式获取传递的参数:
public class MyFragment extends Fragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
String value = requireArguments().getString("key");
}
}
实例22:使用ViewModel实现数据持久化
ViewModel是Android Jetpack组件库中提供的一种用于存储和管理UI相关数据的组件。以下是一个使用ViewModel实现数据持久化的简单示例:
public class MyViewModel extends ViewModel {
private MutableLiveData<String> MutableLiveData;
public LiveData<String> getMutableLiveData() {
if (MutableLiveData == null) {
MutableLiveData = new MutableLiveData<>();
MutableLiveData.setValue("Hello World!");
}
return MutableLiveData;
}
}
在Activity中,你可以通过以下方式获取ViewModel的实例:
MyViewModel viewModel = new ViewModelProvider(this).get(MyViewModel.class);
viewModel.getMutableLiveData().observe(this, new Observer<String>() {
@Override
public void onChanged(String value) {
// 处理数据变化
}
});
实例23:使用LiveData观察数据变化
LiveData是Android Jetpack组件库中提供的一种用于观察数据变化的组件。以下是一个使用LiveData观察数据变化的简单示例:
public class MyLiveData extends LiveData<String> {
private String value;
public void setValue(String value) {
this.value = value;
super.setValue(value);
}
}
在Activity中,你可以通过以下方式观察LiveData数据变化:
MyLiveData myLiveData = new MyLiveData();
myLiveData.observe(this, new Observer<String>() {
@Override
public void onChanged(String value) {
// 处理数据变化
}
});
实例24:使用LiveData实现数据同步
LiveData可以与Firebase一起使用,实现数据同步。以下是一个使用LiveData实现数据同步的简单示例:
”`java
public class MyLiveData extends LiveData
private DatabaseReference mDatabaseReference;
public MyLiveData(DatabaseReference databaseReference) {
mDatabaseReference = databaseReference;
}
@Override
protected void onActive() {
super.onActive();
mDatabaseReference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
setValue(dataSnapshot);
}
