Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/215.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 从preferences.xml启动“活动”,并在onActivityResult中获取结果_Android_Android Preferences_Android Activity - Fatal编程技术网

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,您可以看到您的意图是通过startActivity
startActivity(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)
。此外,这是预期的(意图)
似乎没有那么直截了当,因此比匹配首选项键更容易出错。因此,目前我将使用我的解决方案。可能重复: