这个问题花了我几天的时间,没有用。总之,为了示例,我有两个Activities
,我称之为MainActivity
和SearchActivity
。 MainActivity
有一个按钮,可以将您带到SearchActivity
的搜索屏幕,我有一个预设值的按钮,我希望将其传回MainActivity
。到现在为止还挺好。我在调试器中单击按钮我可以看到我的额外值和下一个断点在MainActivity
中的onCreate中,当我得到额外的东西时,什么都没有,没有,一切都消失了。所以这里是重要的部分,代码:
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);
}
}
}
}
}
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();
}
});
}
}
的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>
答案 0 :(得分:2)
问题在于返回结果的类。
正如米克尔在另一个答案中指出的那样:
Intent(Context packageContext, Class cls) 在API级别1中添加
为特定组件创建意图。 所有其他领域(行动, data,type,class)为null ,尽管稍后可以使用它们进行修改 显式调用。这提供了创建意图的便捷方式 用于执行硬编码的类名,而不是 依靠系统为您找到合适的课程;看到 setComponent(ComponentName)以获取有关影响的更多信息 这个。
您没有显式设置数据参数,如上面的文档所述,而是尝试将Extra添加到失败的null Data对象。
相反,我会将您的课程更改为以下内容:
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();
}
});
}
}
这将初始化你的Intent并允许你向它添加额外的数据(这也是你发回数据的正常方式,通常不需要发回与特定Intent相关的结果。
答案 1 :(得分:1)
您正在使用key
“YOUTUBE_URL”保存extra
和key
“VIDEO_URL”以检索它,但不存在。变化
String url = data.getExtras().getString("VIDEO_URL");
到
String url = data.getExtras().getString("YOUTUBE_URL");
此外,您正在使用创建MainActivity
的方式创建Intent
的新实例。将其更改为
Intent data = new Intent(); // empty constructor
data.putExtra("YOUTUBE_URL", videoUrl);
致电onCreate()
后,您不应该转到setResult()
。你应该去onActivityResult()
答案 2 :(得分:1)
我在单独的类中为类似地图的结构定义键,例如共享首选项,意图等,例如
public class Utils {
在该课程中,我使用以下内容来定义一个键:
public static final String KEY_VIDEO_URL = "com.example.myapp.KEY_VIDEO_URL";
在我的主要代码中,我指的是这样的键:
Intent incomingIntent = getResult();
String incomingURL = incomingIntent.getStringExtra(Utils.KEY_VIDEO_URL);
...
这有助于我避免一些错误。
答案 3 :(得分:1)
我复制了你的代码并尝试在我的盒子上复制你的项目,我添加了几行,这样我可以像布局一样运行它...找到下面的代码使用..
MainActivity.java
package com.example.stackoverflow;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends Activity {
final MainActivity mainActivity = this;
final int SEARCH_VIDEO_REQUEST = 1;
TextView returntext;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
returntext = (TextView)findViewById(R.id.returnt);
Button btnSearch = (Button)findViewById(R.id.btnSearch);
btnSearch.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent search = new Intent(MainActivity.this, SearchActivity.class);
startActivityForResult(search, SEARCH_VIDEO_REQUEST);
}
});
}
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Log.d("ret", "returned data is: "+ data);
// super.onActivityResult(requestCode, resultCode, data);
Log.d("ret", "returned data is: "+ data);
if (requestCode == SEARCH_VIDEO_REQUEST) {
if (resultCode == RESULT_OK) {
String url = data.getExtras().getString("VIDEO_URL");
if (url != null) {
returntext.setText(url);
}
}
}
}
}
SearchActivity.java
package com.example.stackoverflow;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class SearchActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.search);
Button btnSend = (Button)findViewById(R.id.searchret);
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();
}
});
}
}
manifest资源配置文件
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.stackoverflow"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:label="@string/app_name"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.Black.NoTitleBar" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".SearchActivity"
android:label="@string/app_name"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.NoTitleBar" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
</application>
activity_main.xml(主要活动的布局)
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Main Activity Screen" />
<Button
android:id="@+id/btnSearch"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignRight="@+id/textView1"
android:layout_below="@+id/textView1"
android:layout_marginRight="26dp"
android:layout_marginTop="140dp"
android:text="Button" />
<TextView
android:id="@+id/returnt"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp"
android:textSize="12dp"
android:textColor="#454545"
android:gravity="center_horizontal"
android:layout_alignParentBottom="true"
android:text="received text.." />
search.xml(搜索活动的布局)
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/textViewkj1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Search Screen" />
<Button
android:id="@+id/searchret"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="26dp"
android:layout_marginTop="140dp"
android:text="Search Screen Button" />
我已将项目导出为存档,以便您可以在本地轻松导入和测试..这样可以正常工作,因此您可以与工作区中的内容进行比较。 下载here
希望这有帮助,干杯!
答案 4 :(得分:0)
我认为问题与此有关:
Intent(Context packageContext, Class cls) 在API级别1中添加
为特定组件创建意图。 所有其他领域(行动, data,type,class)为null ,尽管稍后可以使用它们进行修改 显式调用。这提供了创建意图的便捷方式 用于执行硬编码的类名,而不是 依靠系统为您找到合适的课程;看到 setComponent(ComponentName)以获取有关影响的更多信息 这个。
答案 5 :(得分:0)
你可以试试这个:
Bundle extras;
String url;
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
extras = getIntent().getExtras();
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) {
if (extras != null) {
url = extras.getStringExtra("VIDEO_URL");
}
if (url != null) {
txtUrl.setText(url);
}
}
}
}
}
答案 6 :(得分:0)
我能够运行代码并获得少量更正的结果
修改
Intent search = new Intent(v.this, SearchActivity.class);
在MainActivity
Intent search = new Intent(MainActivity.this,SearchActivity.class);
并修改
Intent data = new Intent(SearchActivity.this, MainActivity.class);
在SearchActivity
Intent data =new Intent();
下面是完整代码
public class MainActivity extends Activity {
public static final int SEARCH_VIDEO_REQUEST = 1;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
View btnSearch = findViewById(R.id.button1);
btnSearch.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent search = new Intent(MainActivity.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) {
Toast.makeText(this, "url"+url, Toast.LENGTH_SHORT).show();
//txtUrl.setText(url);
}
}
}
}
}
public class SearchActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Button btnSend = new Button(this);
setContentView(btnSend);
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();
}
});
}
}
答案 7 :(得分:0)
在SearchAcivity
中,而不是
Intent data = new Intent(SearchActivity.this, MainActivity.class);
使用空构造函数,如:
Intent data = new Intent();