2013-07-16 3 views
5

Этот вопрос занял у меня несколько дней головокружения безрезультатно. Короче говоря, у меня есть два Activities для примера, который я назову их MainActivity и SearchActivity. У MainActivity есть кнопка, которая приведет вас к экрану поиска, который является SearchActivity, и там у меня есть кнопка с предустановленным значением, которое я хочу передать обратно на MainActivity. Все идет нормально. Я нажимаю кнопку в отладчике. Я могу видеть мои дополнительные значения, а следующая точка останова находится в onCreate в MainActivity, когда я получаю дополнительные услуги, ничего, ни одного, все прошло. SO здесь является важной частью, код:Информация, передаваемая основной деятельности, теряется

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

Проблема с классом возвращающей результат.

Как Mikel указывает в другой ответ:

Intent(Context packageContext, Class cls)Добавлено в уровне API 1

Создайте намерение для конкретного компонента. Все остальные поля (действие, данные, тип, класс) ноль, хотя они могут быть изменены позже с помощью явных вызовов. Это обеспечивает удобный способ создания намерения , который предназначен для выполнения имени жесткого кода, а не , полагающегося на систему, чтобы найти подходящий для вас класс; см. setComponent (ComponentName) для получения дополнительной информации о последствиях .

Вы не указали явный параметр данных в качестве приведенной выше документации, а вместо этого пытаетесь добавить дополнительный объект null, который не работает.

Вместо этого я хотел бы изменить свой класс на следующее:

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 и позволяет добавлять дополнительные данные к нему (это также нормально, как вы бы отправить обратно данные, там обычно не требуется отправить результат, привязанный к определенному намерению.

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

+0

Итак, имя параметра VIDEO_URL одинаково с обеих сторон опровергает его здесь. Это не печь. Проблема в том, что extras имеет значение null после получения запроса – infinity

+0

Вызывается ли 'onActivityResult()'? Вы пытались изменить «Intent» во второй «Деятельности» так, как я предложил? – codeMagic

+0

Да, ничего хорошего.Есть определенная проблема с моей основной деятельностью, но я не вижу, что это такое. Я могу передать дополнительные функции в SearchActivity, но не вернуться к основному. В панели отладки дополнительные функции пусты. – 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 одинаково с обеих сторон опровергает его здесь. Это не печь. Проблема заключается в дополнительном статусе null после получения запроса. – 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 у к

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

ManifestFile

<?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

Надеюсь, это поможет, приветствия!

Смежные вопросы