Ночной режим для SharedPreferences вызывает только ошибки - PullRequest
0 голосов
/ 15 апреля 2020

У меня теоретически есть 2 связанных вопроса.

1) Я пытался сделать ночной режим для своего приложения. Это пока работает довольно хорошо. Затем я хотел поставить настройку, выбранную пользователем для SharedPreferences. В моей первой попытке это просто не сработало. Все, что я делал, это краснел и вызывал ошибки. После долгих исследований Inte rnet я нашел другую идею. Теперь приложение запускается, но сразу падает снова. Ошибка должна быть в SharedPreferences, потому что как только я удаляю эту часть, она снова работает. Я просто не могу найти ошибку, и она не показывает мне красную область или около того.

2) Просто чтобы убедиться, что мои исследования верны. Правда ли, что больше нельзя сделать ночной режим, связанный со временем? Значит темно ночью, светло днем? Я обнаружил, что MODE_NIGHT_AUTO_TIME должен был сделать это, но устарел, и они предлагают использовать MODE_NIGHT_AUTO_BATTERY, что-то действительно отличное.

кстати. Вот мой код, если он помогает из настройки:

public class Settings extends AppCompatActivity {

    private static final String TAG = "SettingsActivity";
    private RelativeLayout layout;
    private SharedPreferences preferences;
    private Bundle savedInstanceState;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_settings);

        assert getSupportActionBar() != null;
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        Spinner spinner = findViewById(DarkMode);

        spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                Log.e(TAG, "onItemSelected: " + position);
                handleNightMode(position);
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {
                Log.e(TAG, "onNothingSelected: ");
            }
        });

    }

    private void handleNightMode(int position) {

        switch (position) {
            case 0:
                Log.e(TAG, "Nothing Selected");
                break;
            case 1:
                Log.e(TAG, "FOLLLOW_SYSTEM");
                AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM);
                getDelegate().applyDayNight();
                break;
            case 2:
                Log.e(TAG, "YES");
                AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
                getDelegate().applyDayNight();
                break;
            case 3:
                Log.e(TAG, "NO");
                AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
                getDelegate().applyDayNight();
                break;
            case 4:
                Log.e(TAG, "AUTO");
                AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_AUTO_BATTERY);
                getDelegate().applyDayNight();
                break;
            default:
                Log.e(TAG, "FOLLLOW_SYSTEM");
                break;
        }

        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
        String NightMode = preferences.getString("prefTheme", "NO");
        if (NightMode.equals("YES"))
            AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
        if (NightMode.equals("NO"))
            AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_AUTO_BATTERY);
        else if (NightMode.equals("AUTO"))
            AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_AUTO_BATTERY);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

MainActivity:

public class MainActivity extends AppCompatActivity {

    int currentDayNight;
    private Button settings;
    private RelativeLayout layout;
    private SharedPreferences preferences;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        layout = findViewById(R.id.layout);

        settings = findViewById(R.id.btn_settings);

        currentDayNight = AppCompatDelegate.getDefaultNightMode();

        settings.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                openSettings();
            }
        });
    }

    private void openSettings() {
        Intent intent = new Intent(this, Settings.class);
        startActivity(intent);
    }
}

logcat:

04-16 21:31:59.861 11136-11136/? I/art: Not late-enabling -Xcheck:jni (already on)
04-16 21:32:00.033 11136-11136/com.goldenegg.darkmode W/art: Before Android 4.1, method android.graphics.PorterDuffColorFilter androidx.vectordrawable.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter, android.content.res.ColorStateList, android.graphics.PorterDuff$Mode) would have incorrectly overridden the package-private method in android.graphics.drawable.Drawable
04-16 21:32:00.086 11136-11136/com.goldenegg.darkmode I/art: Rejecting re-init on previously-failed class java.lang.Class<androidx.core.view.ViewCompat$2>
04-16 21:32:00.087 11136-11136/com.goldenegg.darkmode I/art: Rejecting re-init on previously-failed class java.lang.Class<androidx.core.view.ViewCompat$2>
04-16 21:32:00.168 11136-11149/com.goldenegg.darkmode I/art: Background partial concurrent mark sweep GC freed 523(79KB) AllocSpace objects, 0(0B) LOS objects, 50% free, 1007KB/2031KB, paused 6.320ms total 27.683ms
04-16 21:32:00.204 11136-11136/com.goldenegg.darkmode D/AndroidRuntime: Shutting down VM


    --------- beginning of crash
04-16 21:32:00.205 11136-11136/com.goldenegg.darkmode E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.goldenegg.darkmode, PID: 11136
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.goldenegg.darkmode/com.goldenegg.darkmode.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
        at android.app.ActivityThread.access$800(ActivityThread.java:151)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:135)
        at android.app.ActivityThread.main(ActivityThread.java:5254)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference
        at com.goldenegg.darkmode.MainActivity.onCreate(MainActivity.java:34)
        at android.app.Activity.performCreate(Activity.java:5990)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387) 
        at android.app.ActivityThread.access$800(ActivityThread.java:151) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) 
        at android.os.Handler.dispatchMessage(Handler.java:102) 
        at android.os.Looper.loop(Looper.java:135) 
        at android.app.ActivityThread.main(ActivityThread.java:5254) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at java.lang.reflect.Method.invoke(Method.java:372) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 

Спасибо за вашу помощь.

хорошего дня

...