java - 在我返回 Android 项目中的 Activity 之前,变量不会得到更新

标签 java android

我设置了一些变量来表示用户在首选项 Activity 中选择只使用 wifi 还是不使用首选项。然后,我设置了一个 onSharedPreferenceChanged 来根据用户的选择更改变量。

该应用需要从互联网下载数据,但我希望用户能够选择一些选项,例如要使用哪种类型的网络。我试图遵循 Activity 功能的逻辑,我认为问题在于 onSharedPreferenceChanged 中的变量发生了变化,但在我回来之前不会刷新,但我不确定如何继续。我发现我可以使用 Intent 类刷新 Activity ,但它在函数中需要是静态的,但如果它是静态的,它就不起作用,所以我把自己编码到一个角落可以这么说.

public class SettingsActivity extends AppCompatActivity {

static final String TAG = "SettingsActivity";
public static final String WIFI = "WiFi";
public static final String FIRST = "First";

public static final String SHARED_PREFS = "sharedPrefs";
public static final String WIFI_CONNECTION = "WiFi";
public static final String CELLULAR_CONNECTION = "Cellular";
public static final String WIFI_PREFERENCE = "WiFi Enabled";
public static final String NO_PREFERENCE = "First Enabled";

public static final String NO_CONNECTION = "No Connection";

public static final String PREF_NETWORK_TYPE = "network_choice";

public static String sPref = null;

private NetworkCheck networkCheck = new NetworkCheck();
SharedPreferences sharedPrefs;
private static boolean prefWifi;
private static boolean noPreferredNetwork;
private static boolean wifiConnected = false;
private static boolean cellularConnected = false;
public static boolean networkConnected;
public static boolean refreshActivity = false;

@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);
    }
    PreferenceManager.setDefaultValues(this, R.xml.root_preferences, false);

    IntentFilter filter = new IntentFilter(CONNECTIVITY_SERVICE);
    networkCheck = new NetworkCheck();
    this.registerReceiver(networkCheck, filter);
}

@Override
public void onDestroy() {
    super.onDestroy();
    if (networkCheck != null) {
        this.unregisterReceiver(networkCheck);
    }
}

@Override
public void onStart() {
    super.onStart();
    sharedPrefs = PreferenceManager.getDefaultSharedPreferences(this);
    sPref = sharedPrefs.getString(PREF_NETWORK_TYPE, "First");
    if(sPref == null){
        sPref = FIRST;
    }
    switch (sPref) {
        case WIFI:
            prefWifi = true;
            noPreferredNetwork = false;
            break;
        case FIRST:
            prefWifi = false;
            noPreferredNetwork = true;
            break;
        default:
            prefWifi = false;
            noPreferredNetwork = true;
    }
    Log.i(TAG, "onSharedPreferenceChanged: onStart - " + sPref + " " + prefWifi + " " + noPreferredNetwork);
    Toast.makeText(this, prefWifi + " " + noPreferredNetwork, Toast.LENGTH_LONG).show();

    //checkNetworkFlags(this);
}

@Override
protected void onPause() {
    super.onPause();
    networkType();
    Log.i(TAG, "onSharedPreferenceChanged: onPause- " + sPref + " " + prefWifi + " " + noPreferredNetwork);

}


public void networkType() {
    sharedPrefs = getSharedPreferences(SHARED_PREFS, MODE_PRIVATE);
    SharedPreferences.Editor editor = sharedPrefs.edit();
    editor.putBoolean(WIFI_PREFERENCE, prefWifi);
    editor.putBoolean(NO_PREFERENCE, noPreferredNetwork);
    editor.putBoolean(NO_CONNECTION, networkConnected);
    editor.apply();
}

public static class SettingsFragment extends PreferenceFragmentCompat implements SharedPreferences.OnSharedPreferenceChangeListener {

    @Override
    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
        setPreferencesFromResource(R.xml.root_preferences, rootKey);
    }

    @Override
    public void onResume() {
        super.onResume();
        getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
    }

    @Override
    public void onPause() {
        super.onPause();
        getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
    }

    @Override
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {

        if (key.equals(PREF_NETWORK_TYPE)) {

            prefWifi = sPref.equals(WIFI);
            noPreferredNetwork = sPref.equals(FIRST);
            if (prefWifi) {
                sPref = WIFI;
                refreshActivity = true;
            } else if (noPreferredNetwork) {
                sPref = FIRST;
                refreshActivity = true;
            }
        }
        Log.i(TAG, "onSharedPreferenceChanged: inTheFragment- " + sPref + " " + prefWifi + " " + noPreferredNetwork);

    }
}

private void refreshActivity(){
    finish();
    startActivity(getIntent());
}
  }

变量 sPrefprefWifinoPreferredNetwork 在我回到 Activity 之前不会更新,我不确定在哪里按照我写在代码中的逻辑去做。我错过了什么?底部的 refreshActivity 没有实现,但我认为它可以用于某个地方,但我现在想不出办法。

最佳答案

那是因为你只更新了fragment中的变量,并没有根据变量值更新Activity中的view。因此,您需要监听 Activity 中的偏好更改,然后更新您的 View 。

将这样的内容添加到您的 Activity :

SharedPreferences.OnSharedPreferenceChangeListener listener = new SharedPreferences.OnSharedPreferenceChangeListener() {
  public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {

    // update your variables here

    // update your view according to the variables here.

  }
};

sharedPrefs = PreferenceManager.getDefaultSharedPreferences(this);
sharedPrefs.registerOnSharedPreferenceChangeListener(listener);

关于java - 在我返回 Android 项目中的 Activity 之前,变量不会得到更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57133078/

相关文章:

android -\调试\stableIds.txt : error: failed to open: the data is invalid. (13)

java - WorkManager 找不到所需的零参数构造函数

android - 可以在 XML 布局中访问首选项吗?

android - 使用 openCV 检测面部并在其上应用蒙版

Java - x32 和 x64 之间的奇数内存消耗

java - 简单的java程序根据它们的值来处理canopy簇字符串

Java 8 : How can I convert a for loop to run in parallel?

java - RabbitMQ:在 Node.js 中发布,在 Java 中订阅

java - 计算运行平均值的逻辑错误

android - 如何检索移动网站html源代码,android