一、SharedPreferences存储。
SharedPreferences是一个轻量级的存储辅助类,用来保存应用的一些常用配置,它是使用键值对的方式来存储数据的。
SharedPreferences存储分三步实现:
1、调用getSharedPreferences对象的edit()方法获取SharedPreferences.Editor对象。
2、利用putXXX()方法向SharedPreferences.Editor对象中添加数据。
3、调用apply()或commit()方法提交数据。
//添加数据
Button button=findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//sp增加、修改数据
//MODE_PRIVATE 别的程序不能读 "user"是文件名
SharedPreferences sp=getSharedPreferences("user",MODE_PRIVATE); //接口
SharedPreferences.Editor editor=sp.edit(); //拿到接口方法的引用
editor.putString("username1","湖南中医药大学!!");
editor.putBoolean("isLogin",true);
//editor.remove("username");删除
editor.commit();
}
});
//读取数据
Button button2=findViewById(R.id.button2);
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//sp读取数据
//MODE_PRIVATE 别的程序不能读 只有当前应用程序才能对 SharedPreferences 文件进行读写
SharedPreferences sp=getSharedPreferences("user",MODE_PRIVATE); //接口
String username1=sp.getString("username1","");//第二个参数是默认值
Boolean isLogin=sp.getBoolean("isLogin",false);
Log.i("sp","username1=" + username1 + "isLogin=" + isLogin);
}
});
二、 欢迎页面及自动登录 。
思想:就是运用SharedPreferences存储登录状态,下次登录的时候读取登录状态即可。
1、登录页面:
if(name.equals("千丘星")&&password.equals("123456")){
//跳转主页面+保存用户名+登录状态
SharedPreferences sp=getSharedPreferences("user",MODE_PRIVATE); //接口
SharedPreferences.Editor editor=sp.edit(); //拿到接口方法的引用
editor.putString("username",name);
editor.putBoolean("isLogin",true);
editor.commit();
Intent intent=new Intent(Login_Activity.this,MainActivity.class);
startActivity(intent);
}
else {
Toast.makeText(Login_Activity.this,"登录失败",Toast.LENGTH_SHORT).show();
}
值得注意点是,数据存储应该放在Intent跳转前面,如果先跳的话,活动被杀死了,数据可能还没来得及存储。
2、欢迎页面及判断登陆转态,自动登录。
public class WelcomeActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_welcome);
//要看到界面 onCreate需要执行完
//线程
Thread thread = new Thread() {
@Override
public void run() {
super.run();
//休眠
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
SharedPreferences sp = getSharedPreferences("user", MODE_PRIVATE);
Boolean isLogin = sp.getBoolean("isLogin", false);
Intent intent;
if(isLogin) {
intent = new Intent(WelcomeActivity.this, MainActivity.class);
} else {
intent = new Intent(WelcomeActivity.this, Login_Activity.class);
}
startActivity(intent);
}
};
thread.start();
}
}
白屏问题原因是,如果要看到欢迎界面,onCreate必须要执行完,而如果延时放在这个活动的主线程里,主线程跑完了而延时还没有跑完就会出现白屏的问题。解决方法就是加一个线程,把延时以及判断登录转态等的行为放在这个线程里,子线程和主线程同步进行就可以解决白屏现象,显示欢迎界面。
三、沉浸式状态栏。
沉浸式状态栏就涉及到第三方框架了。
第三方网址:
http:// https://github.com/gyf-dev/ImmersionBar
//https://github.com/gyf-dev/ImmersionBar
// 基础依赖包,必须要依赖
implementation 'com.geyifeng.immersionbar:immersionbar:3.2.2'
// kotlin扩展(可选)
implementation 'com.geyifeng.immersionbar:immersionbar-ktx:3.2.2'
// fragment快速实现(可选)已废弃
implementation 'com.geyifeng.immersionbar:immersionbar-components:3.2.2'
在哪个页面用就在哪个活动里调用:
ImmersionBar.with(this)
// .statusBarColor(R.color.purple_200) //状态栏颜色,不写默认透明
.init();
需要注意的地方是,如果使用了沉浸式状态栏,那么这个活动页面的顶部开始就是整个手机屏幕最顶部(电量等)。如果没有设置透明,注意调整控件位置,避免被顶部状态栏覆盖遮挡。
四、 MaterialCardView(圆角、阴影)。
直接调用MaterialCardView控件。注意的是在里面加一层布局再添加控件。
<!-- app:cardElevation="10dp" 设置阴影范围-->
<com.google.android.material.card.MaterialCardView
android:layout_width="350dp"
android:layout_height="300dp"
android:layout_marginBottom="20dp"
android:elevation="8dp"
app:cardCornerRadius="15dp"
app:cardElevation="10dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ImageView
android:layout_width="match_parent"
android:layout_height="230dp"
android:background="@drawable/i1" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="先生名叫秦霄贤"
android:textColor="#000000"
android:textSize="17sp" />
</LinearLayout>
</com.google.android.material.card.MaterialCardView>