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。
我有一个偏好 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。