我有一个“偏好设置”活动,我想在其中添加一个按钮。如果单击此按钮,它将加载一些数据并更新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);
}
答案 0 :(得分:0)
同一应用程序无法在屏幕上同时显示2个活动。这意味着Main Activity不能工作,直到它位于栈顶为止。
那么,如何调用首选项活动?更改偏好后是什么触发主要活动?
因此,假设用户处于主要活动中,并且意图打开了偏好活动,则您可以通过多种方式进行操作。
您可以启动期望结果的preferenceActivity,并且在Toast的代码所在的位置可以加载数据(最好是异步的),然后再完成带有结果的活动。
另一个选项是注释中的内容。使MainActivity收听onResume中的广播,并且onPause停止收听。然后,Preference Activity将触发一个异步过程并完成自身。现在可以看到主要活动,并且当异步过程结束时,发送主要活动将接收的广播。如果异步过程可以加快速度,则可以将信息存储在共享首选项中,并在MainActivity启动时获取数据。或者,您也可以使用标志启动MainActivity以返回到堆栈中,并传递一个额外的参数,该参数可以在mainActivity的onNewIntent()方法中获取并完成所需的工作。
但是,基本上,您需要搜索如何将信息从一个活动传递到堆栈中的另一个活动。