5

その問題は、役に立たずに頭をぶつけて数日かかりました。要するに、例のために 2 つあり、と とActivities呼びます。には検索画面に移動するボタンがあり、そこに に戻したいプリセット値のボタンがあります。ここまでは順調ですね。デバッガーでボタンをクリックすると、余分な値が表示され、次のブレークポイントは onCreate にあり、余分なものを取得すると何もありません。SOここに重要な部分、コードがあります:MainActivitySearchActivityMainActivitySearchActivityMainActivityMainActivity

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

8 に答える 8

2

問題は、結果を返すクラスにあります。

ミケルが別の答えで指摘しているように:

Intent(Context packageContext, Class cls) API レベル 1 で追加

特定のコンポーネントのインテントを作成します。他のすべてのフィールド (アクション、データ、タイプ、クラス) は nullですが、後で明示的な呼び出しで変更できます。これにより、システムに依存して適切なクラスを見つけるのではなく、ハードコーディングされたクラス名を実行することを目的としたインテントを作成する便利な方法が提供されます。この影響の詳細については、setComponent(ComponentName) を参照してください。

上記のドキュメントに記載されているように data パラメータを明示的に設定しているのではなく、null Data オブジェクトに 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();
            }
        });
    }
}

これにより、Intent が初期化され、Extra データを追加できるようになります (これは、データを送り返す通常の方法でもあります。通常、特定の Intent に関連付けられた結果を送り返す必要はありません。

于 2013-08-05T14:12:52.907 に答える
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()

于 2013-07-16T23:00:31.257 に答える
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);
                    }
                }
            }
        }
    }
于 2013-08-05T12:44:25.543 に答える
0

SearchAcivity代わりに

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

次のように、空のコンストラクターを使用します。

Intent data = new Intent();
于 2013-08-07T08:11:48.550 に答える
0

問題はこれに関連していると思います:

Intent(Context packageContext, Class cls) API レベル 1 で追加

特定のコンポーネントのインテントを作成します。他のすべてのフィールド (アクション、データ、タイプ、クラス) は nullですが、後で明示的な呼び出しで変更できます。これにより、システムに依存して適切なクラスを見つけるのではなく、ハードコーディングされたクラス名を実行することを目的としたインテントを作成する便利な方法が提供されます。この影響の詳細については、setComponent(ComponentName) を参照してください。

于 2013-08-01T21:52:21.973 に答える