首选项中的Android Button更改MainActivity

时间:2019-05-24 12:00:13

标签: java android android-button android-preferences

我有一个“偏好设置”活动,我想在其中添加一个按钮。如果单击此按钮,它将加载一些数据并更新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.javapublic 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);

    }

1 个答案:

答案 0 :(得分:0)

同一应用程序无法在屏幕上同时显示2个活动。这意味着Main Activity不能工作,直到它位于栈顶为止。

那么,如何调用首选项活动?更改偏好后是什么触发主要活动?

因此,假设用户处于主要活动中,并且意图打开了偏好活动,则您可以通过多种方式进行操作。

您可以启动期望结果的preferenceActivity,并且在Toast的代码所在的位置可以加载数据(最好是异步的),然后再完成带有结果的活动。

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

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