【问题标题】:Android Button in preferences changing the MainActivity偏好设置中的 Android Button 更改 MainActivity
【发布时间】:2019-05-24 12:00:12
【问题描述】:

我有一个偏好活动,我想在其中添加一个按钮。如果单击此按钮,它应该加载一些数据并更新 MainActivity。

如何从 PreferenceActivity 更改 MainActivity 中的内容?

我无法从所有其他 SO 问题中弄清楚,所以感谢您为我指出解决方案! :)

我的代码

res/xml/preferences.xml

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">

    <Preference
        android:key="loadDataButton"
        android:title="Click to update data"
        android:summary="This needs internet connection."
        android:widgetLayout="@layout/load_data_button"
        ></Preference>
</PreferenceScreen>

编辑:res/layout/load_data_button.xml

或许有人也可以在这里使用onClick。

<?xml version="1.0" encoding="utf-8"?>
<Button
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/loadDataButton"
    android:text="Button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:onClick="loadDataButtonClicked">
</Button>

PreferencesActivity.java

我认为让Toast 在这里工作会告诉我如何解决问题。

import android.os.Bundle;
import android.preference.Preference;
import android.preference.PreferenceActivity;
import android.preference.PreferenceFragment;
import android.widget.Toast;

public class PreferencesActivity extends PreferenceActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getFragmentManager().beginTransaction().replace(android.R.id.content, new MyPreferenceFragment()).commit();

    }

    public static class MyPreferenceFragment extends PreferenceFragment
    {
        @Override
        public void onCreate(final Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            addPreferencesFromResource(R.xml.preferences);

            Preference button = findPreference("loadDataButton");
            button.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
                @Override
                public boolean onPreferenceClick(Preference preference) {

                    // simple code works, but I can't access MainActivity
                    Toast.makeText(getApplicationContext(), "Test which doesn't work.", Toast.LENGTH_SHORT).show();

                    return true;
                }
            });


        }

    }

}

我真正想在按钮点击时调用的函数

想必这个函数在MainActivity.java类里面 public class MainActivity extends AppCompatActivity {...}

    public void loadDataButtonClicked(View v) {

        // If permission not given
        if (ContextCompat.checkSelfPermission(getApplicationContext(),
                Manifest.permission.INTERNET) == PackageManager.PERMISSION_DENIED) {
            ActivityCompat.requestPermissions((Activity) getApplicationContext(),
                    new String[] {Manifest.permission.INTERNET},
                    0x2);

        }

        SharedPreferences SP = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
        final String event_key = SP.getString("event_key", "None");

        RequestQueue queue = Volley.newRequestQueue(getApplicationContext());
        String url ="https://www.google.com";

        StringRequest stringRequest = new StringRequest(Request.Method.POST, url,
                new Response.Listener<String>() {/* not important*/};

        queue.add(stringRequest);

    }

【问题讨论】:

  • 尝试使用广播接收器或接口。

标签: java android android-button android-preferences


【解决方案1】:

同一应用不能同时在屏幕上显示 2 个活动。这意味着 Main Activity 不能工作,直到它位于堆栈的顶部。

那么,偏好活动是如何被调用的呢?更改偏好后触发主要活动的原因是什么?

所以假设用户在主要活动中并且一个意图打开了偏好活动,你有几种方法可以做到这一点。

您可以启动期待结果的preferenceActivity,并且您可以加载数据(最好是异步的),然后用结果完成活动。

另一个选项是 cmets 中的内容。让 MainActivity 在 onResume 和 onPause 中收听广播,停止收听。然后 Preference Activity 将触发一个异步过程并自行完成。主要活动现在是可见的,并且当异步过程结束时,然后发送主要活动将接收的广播。如果异步过程可以很快,那么可能将信息存储在共享首选项中,并在 MainActivity 启动时获取数据。或者您也可以使用一个标志启动 MainActivity 以返回堆栈并传递一个额外参数,您可以在 mainActivity 中的方法 onNewIntent() 上获取该参数并执行您想要的工作。

但基本上,您需要搜索如何将信息从一个活动传递到堆栈中的另一个活动。

【讨论】:

  • 这确实是一个意图。 “将信息存储在共享首选项中”,这可能是最简单的选择,但到目前为止,我使用SharedPreferences sp = getSharedPreferences(this.getClass().getName(), MODE_PRIVATE); 或getAplicationContext() 而不是this... 或PreferenceManager.getDefaultSharedPreferences(getBaseContext()); 调用它们。从这两个活动中访问共享偏好的方法是什么。抱歉这个菜鸟问题^^
  • 您可以查看developer.android.com/training/data-storage/shared-preferences。但是让 getSharedPreferences 的第一个参数在两个活动中使用相同的字符串,这将返回相同的 SharedPreferences
  • 谢谢!特别是在使用 Context context = getActivity(); final SharedPreferences prefs = getDefaultSharedPreferences(context); 调用共享首选项并在 onResume-method 中更新 MainActivity 时有效
猜你喜欢
  • 2013-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 2015-06-08
相关资源
最近更新 更多