Android 首选项中的按钮更改 MainActivity

Android Button in preferences changing the MainActivity

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

如何从首选项Activity更改主要Activity中的内容?

我无法从所有其他 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里面的class 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);

    }

无法在同一个应用程序的屏幕上同时显示 2 个活动。这意味着 Main Activity 在到达堆栈顶部之前无法工作。

那么,首选项 activity 是如何调用的?更改首选项后触发主要 activity 的是什么?

所以假设用户在主 activity 中并且意图打开首选项 activity 你有几种方法可以做到这一点。

您可以启动首选项Activity 期待一个结果,您可以在 toast 代码所在的位置加载数据(最好是异步的),然后完成 activity 的结果。

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

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