当前位置: 首页 > 知识库问答 >
问题:

我如何在Android Studio中改进这段SharedPrefence代码?

窦啸
2023-03-14

如何改进这些代码?我试着在API29的应用程序上使用它,但每次我在构建后打开应用程序时,我的应用程序就崩溃了。我在Stackoverflow中找到了这些代码,但由于SharedPefrences等一些功能被弃用而不再工作,我尝试使用新的SharedPeference管理器,但应用程序仍然崩溃。

import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

public class NavigatorActivity extends AppCompatActivity {

    public static final String KEY_CHOICE = "choice";

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // fetch the choice of the user, or return -1 if there is no choice yet
        SharedPreferences prefs = PreferenceManager
                .getDefaultSharedPreferences(this);
        int choice = prefs.getInt(KEY_CHOICE, -1);
        Intent intent = createIntentBasedOnChoice(this, choice);

        startActivity(intent);
        finish();
    }

    // this method returns an Intent based on the passed choice parameter
    public static Intent createIntentBasedOnChoice(Context context, int choice) {
        Intent intent;

        switch (choice) {
            case 1: {
                intent = new Intent(context, AspirantActivity.class);
                break;
            }
            case 2: {
                intent = new Intent(context, StudentActivity.class);
                break;
            }
            case 3: {
                intent = new Intent(context, AspirantActivity.class);
                break;
            }
            case 4: {
                intent = new Intent(context, StudentActivity.class);
                break;
            }
            default: {
                // if there is no choice yet, start the ChoiceActivity
                intent = new Intent(context, ChoiceActivity.class);
                break;
            }
        }
        return intent;
    }
}

然后我有choiceactivity,它应该指导用户选择一个布局为XML的选项。


import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.view.View;
import android.widget.Button;
import android.widget.RadioGroup;

public class ChoiceActivity extends AppCompatActivity {

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_choice);

        final RadioGroup choiceGroup = (RadioGroup) findViewById(
                R.id.group_choices);
        Button submitButton = (Button) findViewById(R.id.button_submit);

        submitButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                int choice;

                switch (choiceGroup.getCheckedRadioButtonId()) {
                    case R.id.button_choice1: {
                        choice = 1;
                        break;
                    }
                    case R.id.button_choice2: {
                        choice = 2;
                        break;
                    }
                    case R.id.button_choice3: {
                        choice = 3;
                        break;
                    }
                    case R.id.button_choice4: {
                        choice = 4;
                        break;
                    }
                    default: {
                        choice = 1;
                        break;
                    }
                }

                // saving the choice of the user
                getSharedPreferences(
                        "com.sckoolboy.app_preferences", Context.MODE_PRIVATE)
                        .edit()
                        .putInt(NavigatorActivity.KEY_CHOICE, choice)
                        .apply();

                Intent intent = NavigatorActivity
                        .createIntentBasedOnChoice(ChoiceActivity.this, choice);

                startActivity(intent);
                finish();
            }
        });
    }
}

这是使用无线电组的ChoiceActivity的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"
    android:orientation="vertical">

    <RadioGroup
        android:id="@+id/group_choices"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">

        <RadioButton
            android:id="@+id/button_choice1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:checked="true"
            android:text="Choice 1" />

        <RadioButton
            android:id="@+id/button_choice2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Choice 2" />

        <RadioButton
            android:id="@+id/button_choice3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Choice 3" />

        <RadioButton
            android:id="@+id/button_choice4"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Choice 4" />

    </RadioGroup>

    <Button
        android:id="@+id/button_submit"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="This is my choice!" />
</LinearLayout>

请问我什么是不对的,如何才能在我的应用程序中不崩溃的代码工作?

我们将非常感谢所有的帮助和帮助。

编辑:这里是堆栈跟踪

Fatal Exception: android.content.ActivityNotFoundException: Unable to find explicit activity class {com.sckoolboy.app/com.sckoolboy.app.b0}; have you declared this activity in your AndroidManifest.xml?
       at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:2016)
       at android.app.Instrumentation.execStartActivity(Instrumentation.java:1673)
       at android.app.Activity.startActivityForResult(Activity.java:4689)
       at androidx.fragment.app.FragmentActivity.startActivityForResult(FragmentActivity.java:10)
       at android.app.Activity.startActivityForResult(Activity.java:4647)
       at androidx.fragment.app.FragmentActivity.startActivityForResult(FragmentActivity.java:10)
       at android.app.Activity.startActivity(Activity.java:5008)
       at android.app.Activity.startActivity(Activity.java:4976)
       at com.sckoolboy.app.Splash$1.run(Splash.java:11)
       at android.os.Handler.handleCallback(Handler.java:873)
       at android.os.Handler.dispatchMessage(Handler.java:99)
       at android.os.Looper.loop(Looper.java:214)
       at android.app.ActivityThread.main(ActivityThread.java:7045)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:964)

共有1个答案

阮鸿煊
2023-03-14

我建议您使用Jetpack Datastore而不是SharedPreferences。这将解决所有API级别的特定问题。
链接:-https://developer.android.com/topic/libraries/architecture/datastore

 类似资料:
  • 使用djanog的异步如何改写下边这段代码:

  • 如何在PHP Smarty中优化这段代码? 现在我有一个代码让我困惑,有一个简单的代码。 当我搜索需要推送值的代码时。 优化如何发挥作用?我能写到数组吗?如果它可以写入数组,我该怎么办?

  • 我已经开始学习JavaScript,我试图制作一个加载条的动画,但我不知道如何使它在条到达终点后重复这个功能,我想也许通过一个循环我可以得到我想要的结果,但我仍然在学习循环,我尝试了不同的方法,改变了整个代码,但没有任何效果。 有人能帮我吗?谢谢你抽出时间。

  • 我正在为我的discord机器人制作一个管理cog,我的代码无法识别“ctx”。PyCharm建议用“self”代替“ctx”,我不知道“self”是做什么的。从PyCharm所说的,还有数以百万计的其他东西,我必须写下它是什么。PyCharm无法识别帮会、发送、作者和频道,它还说是一个无法访问的代码。请注意,如果这似乎是一个非常愚蠢的问题,我是一个初学者,两周前就开始了。 至于代码:

  • 实际上,下面的代码不能用这个命令用Clang编译: . 我只想模仿与C中的“交换习惯用法”相同的行为,使用“using directive”来启用ADL。但是下面的代码哪里错了呢?预期的调用优先级应为:N1::foo 错误消息: 更新: 我将N2::foo更改为可以在某种程度上模仿std::交换的模板方法。所以,这里的问题是为什么不能由在函数中?因为当它们具有相同的优先级时,该函数应该比要调用的模

  • 问题内容: 我的问题主要是关于性能。编译器更好地了解,例如,对象实例化后未修改某些变量。那么,为什么还要打入决赛呢? 我认为这里可能会出现许多结构/逻辑原因,但从性能角度来讲?有关系吗? 谢谢, 问题答案: 在 现代 JVM中,final 不应 影响性能。这对于私有字段尤其如此,但是即使对于非私有字段,JIT仍可以将非最终字段视为最终字段,从而对其进行优化,然后,如果它加载了一些确实修改了该字段的