Android 从preferences.xml启动“活动”,并在onActivityResult中获取结果
这是对我的补充 我可以启动活动,但我也需要能够获得结果。我该怎么做 我试着覆盖我的首选活动,但没有成功Android 从preferences.xml启动“活动”,并在onActivityResult中获取结果,android,android-preferences,android-activity,Android,Android Preferences,Android Activity,这是对我的补充 我可以启动活动,但我也需要能够获得结果。我该怎么做 我试着覆盖我的首选活动,但没有成功 preferences.xml中是否缺少一些额外属性?如果要将数据从首选项活动传递到主活动,请使用以下代码: 在您的主要活动类(发布)中: startActivityForResult(new Intent(main.this, preferences.class), 0); Intent i; i.putStringExtra("name", "tom"); setResult(RESUL
preferences.xml中是否缺少一些额外属性?如果要将数据从首选项活动传递到主活动,请使用以下代码: 在您的主要活动类(发布)中:
startActivityForResult(new Intent(main.this, preferences.class), 0);
Intent i;
i.putStringExtra("name", "tom");
setResult(RESULT_OK, i);
finish();
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 0) {
if (resultCode == RESULT_OK){
Log.d("test", data.getExtraString("name");
}
}
}
在您的首选活动类中(设置结果):
startActivityForResult(new Intent(main.this, preferences.class), 0);
Intent i;
i.putStringExtra("name", "tom");
setResult(RESULT_OK, i);
finish();
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 0) {
if (resultCode == RESULT_OK){
Log.d("test", data.getExtraString("name");
}
}
}
在您的主要活动课中(获取结果):
startActivityForResult(new Intent(main.this, preferences.class), 0);
Intent i;
i.putStringExtra("name", "tom");
setResult(RESULT_OK, i);
finish();
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 0) {
if (resultCode == RESULT_OK){
Log.d("test", data.getExtraString("name");
}
}
}
您可以根据需要添加任意多的附加项,不仅可以添加字符串,还可以添加所有标准数据类型
希望我做的一切都对;)
编辑
正如卡雷尔告诉我的,我可能误解了这个问题。
这是您如何从“首选项”活动中的主活动接收数据的方法:
在您的主要活动中:启动首选项活动并附加数据
String foo = "hello";
Intent i = new Intent();
i.putExtra("testString", foo);//You can also add other types of variables here, see [1] for reference
i.setClass(main.this, preferences.class);
startActivity(i);
在您的首选项活动中:接收附加到意图的数据
Bundle b = this.getIntent().getExtras();//[2]
if (b!=null){
String recievedString = b.getString("testString");
//The recievedString variable contains the String "hello" now, see [3]
}
[1]
[2]
[3] 据我所知,最干净的解决方案是倾听对首选项的单击并明确启动意图。这样,activityResult上的
将像往常一样被调用
假设您的意图首选项是用XML定义的,您可以像这样将侦听器附加到它(其中1234
是onActivityResult
的请求代码):
在您的PreferencesActivity类中尝试重写startActivity()
,并在检查意图是否是我们感兴趣的意图后,让它调用startActivityForResult()
,类似于以下内容(请求代码为1234):
根据您的需要,与在代码中添加几个OnPreferenceClickListener
相比,这可能更简单:)如果您查看平台源代码第1000行的PreferenceActivity.java,您可以看到您的意图是通过startActivitystartActivity(header.intent)调用的代码>而不是通过startActivityForResult,所以我认为这是不可能的
但是,您可以尝试覆盖PreferenceActivity的onHeaderClick
函数和onActivityResult
,并查看发生了什么。我自己没有尝试过,所以我不知道,这种方法很有可能在未来的版本中被打破
但也许还有另一种方法对你有效。正如我从你的参考问题中看到的,你是通过意图发起活动的。如果此活动用于编辑设置,那么这不是正确的方法,因为android仅用于启动活动,而不是其他。在我看来,最好通过扩展任何可用的活动来创建您的特定偏好活动,以便对其进行定制。以下是我的自定义ListPreference,我使用它让用户选择应用程序:
public class CustomSelectAppPreference extends ListPreference {
//----- Constructor -----
public CustomSelectAppPreference(Context context, AttributeSet attrs) {
super(context, attrs);
}
//----- Constructor END -----
//----- Public Code -----
public void SetResult(String packageName) {
if(this.callChangeListener(packageName)) {
Editor edit = this.getSharedPreferences().edit();
edit.putString(this.getKey(), packageName);
edit.commit();
}
this.getDialog().dismiss();
}
//----- Public Code END -----
//----- ListPreference Overrides -----
@Override
protected void onPrepareDialogBuilder(Builder builder) {
Log.d("CustomSelectAppPreference", "onPrepareDialogBuilder");
super.onPrepareDialogBuilder(builder);
String selectedPackage = this.getSharedPreferences().getString(this.getKey(), "");
ListAdapter listAdapter = (ListAdapter) new ApplicationsArrayAdapter(this.getContext(), Utilities.getInstalledApplications(this.getContext(), selectedPackage), this);
builder.setAdapter(listAdapter, this);
}
//----- ListPreference Overrides END -----
}
我在我的preferences.xml中使用它,如下所示:
<PreferenceScreen android:key="connection_screen"
android:title="@string/wpref_Connection_Screen_title"
android:summary="@string/wpref_Connection_Screen_summary"
android:shouldDisableView="true">
<com.test.app.CustomSelectAppPreference android:key="userSelectedApplication"
android:title="@string/wpref_userSelectedApplication_title"
android:summary="@string/wpref_userSelectedApplication_summary"
android:dialogTitle="@string/userselectedApplication_dialogTitle"
android:entries="@array/selectedapps_dummy_actions"
android:entryValues="@array/selectedapps_dummy_actionsvalues"
android:defaultValue=""
android:shouldDisableView="true"/>
</PreferenceScreen>
通过使用这种方法,我可以控制我的用户在这项活动中所做的一切,而不会违反android关于偏好的规则
希望这有帮助。您没有回答OP提出的问题。问题是:如何处理从preferences活动启动的意图的结果,即onActivityResult
应该在PreferencesActivity
中。这个问题让我困惑……你的答案似乎是正确的oneNice想法,尽管我担心它可能会崩溃(在未来的Android版本中)因为它假设在单击首选项时总是调用startActivity(Intent)
。此外,这是预期的(意图)
似乎没有那么直截了当,因此比匹配首选项键更容易出错。因此,目前我将使用我的解决方案。可能重复: