gpt4 book ai didi

java - 偏好设置中的 Android 按钮更改 MainActivity

转载 作者:行者123 更新时间:2023-12-02 05:16:04 24 4
gpt4 key购买 nike

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

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

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

我的代码

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);

}

最佳答案

同一应用程序无法在屏幕上同时显示 2 个 Activity 。这意味着主 Activity 在位于堆栈顶部之前无法执行工作。

那么,偏好 Activity 是如何被调用的呢?更改首选项后什么会触发主要 Activity ?

因此,假设用户位于主 Activity 中,并且 Intent 打开首选项 Activity ,您有多种方法可以实现这一点。

您可以启动preferenceActivity并期待结果,并且在toast的代码所在的位置您可以加载数据(最好是异步的),然后使用结果完成 Activity 。

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

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

关于java - 偏好设置中的 Android 按钮更改 MainActivity,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56292261/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com