将数据传递给主要活动将丢失

Ale*_*kov 5 android android-intent android-activity

这个问题花了我几天的头脑,没有用.总之,我有两个Activities对我会打电话给他们的例子的缘故MainActivitySearchActivity.该MainActivity有一个按钮,带你到一个搜索屏幕这是SearchActivity有我有,我想传递回预设值的按钮MainActivity.到现在为止还挺好.我在调试器中单击按钮我可以看到我的额外值和下一个断点在onCreate中MainActivity当我得到额外的东西时什么都没有,没有,全部消失了.所以这里是重要的部分,代码:

MainActivity.class

public class MainActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);


        btnSearch.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent search = new Intent(v.this, SearchActivity.class);
                startActivityForResult(search, SEARCH_VIDEO_REQUEST);
            }
        });
    }

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == SEARCH_VIDEO_REQUEST) {
            if (resultCode == RESULT_OK) {
                String url = data.getExtras().getString("VIDEO_URL");
                if (url != null) {
                    txtUrl.setText(url);
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

SearchActivity.class

public class SearchActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        btnSend.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                String videoUrl = "http://video-url.com";
                Intent data = new Intent(SearchActivity.this, MainActivity.class);
                data.putExtra("VIDEO_URL", videoUrl);
                setResult(RESULT_OK, data);
                finish();
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

AndroidManifest.xml中

<activity
    android:name="com.project.MainActivity"
    android:label="@string/app_name"
    android:configChanges="keyboardHidden|orientation|screenSize"
    android:theme="@android:style/Theme.Black.NoTitleBar"
    android:screenOrientation="portrait">
    <intent-filter>
        <action android:name="android.intent.action.MAIN"/>
        <category android:name="android.intent.category.LAUNCHER"/>
    </intent-filter>
    <intent-filter>
        <action android:name="android.intent.action.SEND"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:mimeType="text/plain"/>
    </intent-filter>
    <intent-filter>
        <action android:name="android.intent.action.MEDIA_MOUNTED"/>
        <data android:scheme="file"/>
    </intent-filter>
</activity>
<activity
    android:name="com.project.SearchActivity"
    android:label="@string/app_name"
    android:theme="@android:style/Theme.NoTitleBar"
    android:screenOrientation="portrait">
</activity>
Run Code Online (Sandbox Code Playgroud)

Dav*_*vid 2

问题在于类返回结果。

正如米克尔在另一个答案中指出的:

Intent(Context packageContext, Class cls) 在 API 级别 1 中添加

为特定组件创建意图。所有其他字段(操作、数据、类型、类)均为 null,尽管稍后可以通过显式调用对其进行修改。这提供了一种方便的方法来创建旨在执行硬编码类名的意图,而不是依赖系统为您找到合适的类;有关此影响的更多信息,请参阅 setComponent(ComponentName)。

您没有按照上面的文档所述显式设置数据参数,而是尝试将 Extra 添加到失败的空数据对象。

相反,我会将您的课程更改为以下内容:

public class SearchActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        btnSend.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                String videoUrl = "http://video-url.com";
                Intent data = new Intent();
                data.putExtra("VIDEO_URL", videoUrl);
                setResult(RESULT_OK, data);
                finish();
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

这将初始化您的 Intent 并允许您向其中添加额外数据(这也是发送回数据的正常方式,通常不需要发送回与特定 Intent 相关的结果。