java - 如何从“设置 Activity ”修改“MainActivity”上的数据?

标签 java android sharedpreferences preferencefragment

我已经尝试了许多其他主题和文章,但我就是找不到我正在寻找的正确内容。 所以我有一个 MainActivity 和一个 SettingsActivity 都是 java 类。在我的主要 Activity 中,有一个按钮,按下时会将计数增加 +1,并将其显示在 TextView 上,它还会使设备在每次增量/每次按下按钮时振动。我想在 SettingsActivity 中设置一个开关首选项,如果保持关闭/错误,则关闭按钮按下时的振动;如果保持打开/正确,则打开按钮按下时的振动。 我不知道如何从 SettingsActivity 检索 SwitchPreferenceCompat 的状态(ON OR OFF)并在 MainActivity 中使用它,因此如果用户在设置 Activity 中关闭开关,振动应该停止按下 MainActivity 中的按钮。 我已经在 MainActivity 中使用共享首选项,用于在应用程序关闭时保存当前计数/数字,并在重新打开时从相同计数恢复。

主要 Activity

package com.saad.tapcounter;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.preference.PreferenceManager;

import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Vibrator;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.Switch;
import android.widget.TextView;
import android.widget.Toast;

import com.google.android.gms.ads.AdRequest;
import com.google.android.gms.ads.AdView;
import com.google.android.gms.ads.MobileAds;

public class MainActivity extends AppCompatActivity {

    private AdView mAdView ;
    int Start;
    TextView txt;
    Button btnU,btnT,btnR;
    Switch sw,sw2;
    private ConstraintLayout Clayout;
    Vibrator vibe;

    Boolean switchPref;

    SharedPreferences sharedPreferences;

    private static long back_pressed;
    private Vibrator Vibrator;

    //Double Tap Exit
    @Override
    public void onBackPressed()
    {
        if (back_pressed + 2000 > System.currentTimeMillis()) super.onBackPressed();
        else Toast.makeText(getBaseContext(), "Press once again to exit!", Toast.LENGTH_SHORT).show();
        back_pressed = System.currentTimeMillis();
    }


    //Inflater for Menu
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.menu,menu);
        return true;

    }

    //Menu
    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        switch(item.getItemId()){
            case R.id.menui1:
                startActivity(new Intent(this, SettingsActivity.class));

                return true;


            default:
                return super.onOptionsItemSelected(item);
        }
    }

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


        Toolbar toolbar = findViewById(R.id.toolbarid);
        setSupportActionBar(toolbar);


        MobileAds.initialize(this, "-APPID-");
        mAdView = findViewById(R.id.adView);
        AdRequest adRequest = new AdRequest.Builder().build();
        mAdView.loadAd(adRequest);

        vibe =(Vibrator)getSystemService(VIBRATOR_SERVICE);
        Clayout = findViewById(R.id.MainLayout);
        btnT =  findViewById(R.id.tapbtn);
        btnR =  findViewById(R.id.resetbtn);
        btnU =  findViewById(R.id.undobtn);
        sw = findViewById(R.id.swch);
        sw2 = findViewById(R.id.darkswch);
        txt =  findViewById(R.id.txtv);
        txt.setTextColor(Color.BLACK);
        sharedPreferences = getSharedPreferences("0",MODE_PRIVATE);

        loadData();
        setData();
        incrementbtn();
        undobtn();
        resetbtn();
        switchbtn();
        themeswitch();
        

    }
    public void loadData(){
        sharedPreferences = getSharedPreferences("0",MODE_PRIVATE);
    }

    private void setData(){
        Start = sharedPreferences.getInt("0",0);
        if(Start==0){
            txt.setText("0");
        }
        else{
            txt.setText(Integer.toString(Start));
        }
    }

    public void incrementbtn(){
        btnT.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                incvibe();
                if (Start != 0) {
                    Start = sharedPreferences.getInt("0", 0);
                    Start += 1;
                    txt.setText(Integer.toString(Start));
                    txtresize();
                } else {
                    Start += 1;
                    txt.setText(Integer.toString(Start));
                }
                sharedPreferences.edit().putInt("0", Start).apply();
            }
        });
    }

    public void undobtn(){
        btnU.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                undovibe();
                if (Start != 0) {
                    Start = sharedPreferences.getInt("0", 0);
                    Start -= 1;
                    txt.setText(Integer.toString(Start));
                }
                else{
                    return;
                }
                sharedPreferences.edit().putInt("0", Start).apply();
            }
        });
    }

    public void resetbtn(){
        btnR.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                resetvibe();
                Start = 0;
                txt.setText(Integer.toString(Start));
                sharedPreferences.edit().putInt("0", Start).apply();

            }
        });
    }

    public void switchbtn(){
        sw.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(sw.isChecked()) {
                    btnR.setEnabled(false);
                    btnT.setEnabled(false);
                    btnU.setEnabled(false);
                    txt.setTextColor(Color.RED);
                }
                else{
                    btnR.setEnabled(true);
                    btnT.setEnabled(true);
                    btnU.setEnabled(true);
                    if(sw2.isChecked()){
                        txt.setTextColor(Color.WHITE);
                    }
                    else{
                        txt.setTextColor(Color.BLACK);
                    }
                }
            }
        });
    }

    public void themeswitch(){
        sw2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(sw2.isChecked()){
                    Clayout.setBackgroundColor(Color.DKGRAY);

                    if(sw.isChecked()){
                        txt.setTextColor(Color.RED);
                    }
                    else{
                        txt.setTextColor(Color.WHITE);
                    }
                }
                else{
                    Clayout.setBackgroundColor(Color.WHITE);
                    if(sw.isChecked()){
                        txt.setTextColor(Color.RED);
                    }
                    else{
                        txt.setTextColor(Color.BLACK);
                    }

                }
            }
        });

    }

    public void txtresize(){

        if(Start > 1000 && Start < 10000){
            txt.setTextSize(80);
        }
        else if (Start > 10000 && Start < 100000){
            txt.setTextSize(60);
        }
        else if (Start > 100000){
            txt.setTextSize(40);
        }
        else{
            return;
        }
    }
    StringBuilder info = new StringBuilder();


    public void undovibe(){
        vibe.vibrate(100);
    }

    public void resetvibe(){
        vibe.vibrate(150);
    }

    public void incvibe(){
        vibe.vibrate(40);
    }

}//Real one

SettingActivity(从“NEW”>“SettingActivity”创建) 我确实在这里自己尝试了一些东西,但它使我的应用程序崩溃了。

package com.saad.tapcounter;

import android.content.SharedPreferences;
import android.os.Bundle;
import android.widget.Toast;

import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.preference.PreferenceFragmentCompat;
import androidx.preference.PreferenceManager;

public class SettingsActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.settings_activity);
        getSupportFragmentManager()
                .beginTransaction()
                .replace(R.id.settings, new SettingsFragment())
                .commit();

        ActionBar actionBar = getSupportActionBar();
        if (actionBar != null) {
            actionBar.setDisplayHomeAsUpEnabled(true);
        }
    }
    public static class SettingsFragment extends PreferenceFragmentCompat {
        @Override
        public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
            setPreferencesFromResource(R.xml.root_preferences, rootKey);

        }
    }



}

root_preference.xml

<PreferenceScreen xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android">

    <PreferenceCategory app:title="Settings"
        app:iconSpaceReserved="false">

        <SwitchPreferenceCompat
            app:key="Switchsett1"
            app:title="Vibration"
            app:summaryOff="Turn Vibration On"
            app:summaryOn="Turn Vibration Off"
            app:iconSpaceReserved="false"
            app:defaultValue="true"
            />

        <SwitchPreferenceCompat
            app:key="Switchset2"
            app:iconSpaceReserved="false"
            app:summaryOff="@string/attachment_summary_off"
            app:summaryOn="@string/attachment_summary_on"
            app:title="@string/attachment_title" />

    </PreferenceCategory>

</PreferenceScreen>

最佳答案

I don't know how to retrieve the state of switch(ON OR OFF) from SettingsActivity

要从共享首选项中获取 SwitchPreferenceCompat 的值,您需要将其作为 Boolean 进行检索

现在您的第一个 SwitchPreferenceCompat 的键是 Switchsett1,因此要检索它的值:

public class MainActivity extends AppCompatActivity {

    Boolean switchPref;

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

        ....

        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
        switchPref = prefs.getBoolean("Switchsett1", false);
        Toast.makeText(this, String.valueOf(switchPref), Toast.LENGTH_SHORT).show(); // shows true if the SwitchPreferenceCompat is ON, and false if OFF.

现在,如果 SwitchPreferenceCompat 为 ON,则上述脚本中的 Toast 显示 true,如果为 ON,则显示 false关闭。

您可以对 Switchset2 SwitchPreferenceCompat 执行相同的操作

关于java - 如何从“设置 Activity ”修改“MainActivity”上的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61552101/

相关文章:

java - 有没有办法检查一个类是否有 main 方法?

java - 如何根据注释为 @Autowire 字段提供不同的 bean 实现?

android - 错误:Failed to resolve: Android-Iconics:library-core:unspecified

java - GoogleAccountCredential getSelectedAccountName() 在设置并实现权限后返回 null

java - Android 首选项错误, "String cannot be cast to int"

java - 从套接字读取二进制数据

java - 如何导入java项目(Eclipse)

android - AlertDialog 中的 NumberPicker 始终激活键盘。如何禁用此功能?

Android - 首选项 - ClassCastException

android - SharedPreferences里存 "JSON.stringify"数据不好吗?