SharedPreferences存储 + 欢迎页面及自动登录(白屏问题) + 沉浸式状态栏 + MaterialCardView(圆角、阴影)

一、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>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在Kotlin+Jetpack中,可以使用ViewModel和LiveData来管理应用程序的状态,包括登录状态和登录Token等。 ViewModel是一种设计模,用于将UI控制器与业务逻辑分开。在ViewModel中,可以将应用程序的状态储存起来,例如登录状态和登录Token。ViewModel可以在配置更改(例如旋转屏幕)时保留状态,因此当用户旋转屏幕时,ViewModel中的数据不会丢失。 LiveData是一种可观察的数据持有者,可以在数据变化时通知观察者。LiveData可以与ViewModel一起使用,以便在ViewModel中储存状态,并在UI控制器中显示状态。例如,可以将登录状态储存在ViewModel中,并使用LiveData将其公开给UI控制器。这样,当登录状态发生变化时,UI控制器会自动更新。 以下是一个简单的示例,说明如何在Kotlin+Jetpack中使用ViewModel和LiveData来管理登录状态和登录Token: 1. 创建一个LoginViewModel类,用于储存登录状态和登录Token: ```kotlin class LoginViewModel : ViewModel() { private val _isLoggedIn = MutableLiveData<Boolean>() private val _loginToken = MutableLiveData<String>() val isLoggedIn: LiveData<Boolean> get() = _isLoggedIn val loginToken: LiveData<String> get() = _loginToken fun login(username: String, password: String) { // 在这里执行登录逻辑,如果登录成功,设置_isLoggedIn为true,并将Token储存在_loginToken中 } fun logout() { // 在这里执行注销逻辑,将_isLoggedIn设置为false,并将_loginToken清空 } } ``` 2. 在UI控制器中使用LoginViewModel: ```kotlin class LoginActivity : AppCompatActivity() { private lateinit var viewModel: LoginViewModel override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_login) viewModel = ViewModelProvider(this).get(LoginViewModel::class.java) // 观察登录状态和登录Token,更新UI viewModel.isLoggedIn.observe(this, Observer { isLoggedIn -> // 更新UI,例如显示或隐藏登录按钮 }) viewModel.loginToken.observe(this, Observer { loginToken -> // 更新UI,例如将Token储存在SharedPreferences中 }) // 在点击登录按钮时调用login()方法 loginButton.setOnClickListener { viewModel.login(usernameEditText.text.toString(), passwordEditText.text.toString()) } // 在点击注销按钮时调用logout()方法 logoutButton.setOnClickListener { viewModel.logout() } } } ``` 这是一个简单的示例,说明如何在Kotlin+Jetpack中使用ViewModel和LiveData来管理登录状态和登录Token。使用ViewModel和LiveData可以有效地管理应用程序的状态,并将UI控制器与业务逻辑分开。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千丘星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值