2013-07-16 36 views
5

這個問題花了我幾天頭沒有用的。總之,我有兩個Activities的例子,我會叫他們MainActivitySearchActivityMainActivity有一個按鈕,將您帶到一個搜索屏幕,該屏幕是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

此代碼似乎在我結束工作。什麼是v.this從這一行「Intent search = new Intent(v.this,SearchActivity.class);」 ? –

+0

「V」是我傳遞給按鈕事件的MainActivity視圖「public void onClick(View v)」。我嘗試過'MainActivity.this'同樣的問題。 – infinity

回答

2

的問題是與類返回結果。

由於米克爾指出了另一個答案:

Intent(Context packageContext, Class cls)在API級別1

創建特定組件的意圖。 所有其他字段(動作, 數據,類型,類)爲空,雖然它們可以稍後用 顯式調用進行修改。這提供了一種方便的方式來創建意圖執行硬編碼類名稱的目的 ,而不是依賴系統爲您找到合適的類的 ;請參閱 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(); 
      } 
     }); 
    } 
} 

這將初始化你的意圖,並允許您額外的數據添加到它(這也是您會發回數據的正常方式,有通常不需要發送與特定意圖綁定的結果。

1

您正在使用key「YOUTUBE_URL」保存extrakey「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()

+0

所以參數VIDEO_URL的名稱在這裏兩邊都是一樣的。這不是烤箱。一旦我收到請求,問題是extras是空的 – infinity

+0

是否調用了'onActivityResult()'?你是否嘗試按照我的建議改變第二個「活動」中的「意圖」? – codeMagic

+0

是的,沒有好處。我的主要活動肯定存在一些問題,但我看不到它是什麼。我可以將附加內容傳遞給SearchActivity,但不能返回到主要的。在調試面板中,extras是空的。 – infinity

1

呃,我錯過了這裏的東西嗎?在SearchActivity中,您使用鍵「YOUTUBE_URL」標識了擴展數據,但在MainActivity中,您嘗試使用鍵VIDEO_URL檢索它。兩個鍵必須相同。

我定義在地圖狀結構鍵,如共享偏好,意圖,並在一個單獨的類等等,例如

公共類的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); 
... 

這有助於我避免一些錯誤。

+0

所以參數VIDEO_URL的名稱在這裏兩邊都是一樣的。這不是烤箱。一旦我收到請求,問題是extras是空的。 – infinity

0

我認爲這個問題與此相關:

Intent(Context packageContext, Class cls) 在API級別1

創建特定組件的意圖。 所有其他字段(動作, 數據,類型,類)爲空,儘管它們稍後可以用 顯式調用進行修改。這提供了一種方便的方式來創建意圖執行硬編碼類名稱的目的 ,而不是依賴系統爲您找到合適的類的 ;請參閱 setComponent(ComponentName)以獲得更多關於此的影響 的信息。

0

U可以試試這個:

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); 
        } 
       } 
      } 
     } 
    } 
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); 

在SearchActivit y以

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(); 
      } 
     }); 
    } 

} 
0

在你SearchAcivity,而不是

Intent data = new Intent(SearchActivity.this, MainActivity.class); 

使用一個空的構造,如:

Intent data = new Intent(); 
1

我複製你的代碼並嘗試複製y我們對我的盒子項目,我添加了幾行,這樣我可以像佈局東西運行它...找到使用下面的代碼..

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

希望這有助於,乾杯!

相關問題