2017-02-13 2 views
0

私は活動の間にエキストラを受けることに問題があります。私のMainActivityでアクティビティ間でインテントエクストラがnullになるのはいつですか?

私は外部のSDカード上のビデオファイルを選択したためにギャラリーの活動を開始します。

public class MainMenu extends Activity { 
    //Button change video 
    Button video_change; 
    //Extra for changing video content 
    Bundle extras; 
    //Intent for Gallery view activity 
    Intent intent; 

    @Override 
    protected void onCreate(final Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
    //... 
    intent = new Intent(getApplicationContext(),GalleryView.class); 

    video_change.setOnClickListener(new View.OnClickListener() { 

        @Override 
        public void onClick(View v) { 

         Uri mUri = null; 
         try { 
          Field mUriField = VideoView.class.getDeclaredField("mUri"); 
          mUriField.setAccessible(true); 
          mUri = (Uri) mUriField.get(myVideoView);   
         } catch(Exception e) { 
          //TODO: Something here 
         } 
         String string = mUri.toString(); 
         intent.putExtra("old_video",string); 
         startActivity(intent);    
        } 
       }); 
     } 

    @Override 
    public synchronized void onResume() { 
     super.onResume(); 
     if (Config.DEBUG) 
      Log.d(CLASS_NAME, "+ ON RESUME +"); 
     try { 
      extras = intent.getExtras(); 
      if (extras != null){ 
       Log.d("++ ON RESUME ++","Found Extra!"); 
       String newvideo = extras.getString("new_video"); 
       Log.d("++ ON RESUME ++","NEW VIDEO: "+ newvideo); 
       Uri tempuri = Uri.parse(newvideo); 
       myVideoView.setVideoURI(tempuri);   
      } 
     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     View decorView = getWindow().getDecorView(); 
     decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE 
       | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION 
       | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 
       | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION 
       | View.SYSTEM_UI_FLAG_FULLSCREEN 
       | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); 
    } 
    } 

はその後、私のGalleryView活動に:私は戻って戻ったときに

public class GalleryView extends Activity { 

    ImageView back_button; 
    ListView videolist; 
    List<String> videos = new ArrayList<String>(); 
    private File[] videoFiles; 
    //private Cursor videocursor; 
    //private int video_column_index; 
    int x=0; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.gallery); 
     back_button = (ImageView) findViewById(R.id.back_button); 
     videolist = (ListView) findViewById(R.id.listview); 

     start_listview(); 

     ArrayAdapter adapter = new ArrayAdapter<String>(this,R.layout.activity_listview,videos); 
     videolist.setAdapter(adapter); 

     videolist.setOnItemClickListener(new OnItemClickListener(){ 
       @Override 
       public void onItemClick(AdapterView<?> adapter, View v, int position, long arg3) { 
        String value = (String)adapter.getItemAtPosition(position); 
        Log.d("VALUE: ",value); 
        Intent i = new Intent(getApplicationContext(),MainMenu.class); 
        // Send the file path 
        i.putExtra("new_video", value); 
        startActivity(i); 
       } 
     }); 

     back_button.setOnClickListener(new OnClickListener() { 
      //videolist.setAdapter(new VideoAdapter(getApplicationContext())); 
      @Override 
      public void onClick(View v) { 
      //videolist.setOnItemClickListener(videogridlistener); 
       Intent intent = new Intent(getApplicationContext(),MainMenu.class); 
       Bundle extras = getIntent().getExtras(); 
       String newString = extras.getString("old_video"); 
       intent.putExtra("new_video", newString); 
       startActivity(intent); 

      } 
     }); 
    } 

    public void start_listview() { 

     String path = ("/storage/extsd/Videos/"); 
     File directory = new File(path); 
     videoFiles = directory.listFiles(); 
     try { 
      for (File f : videoFiles) { 
       Log.d("FILE: ", f.toString()); 
       String file = f.toString(); 
       Uri tempuri = Uri.fromFile(f); 
       videos.add(file); 
      } 
      //Set the visibility of the progress bar to false. 
      findViewById(R.id.relativelayout_progress).setVisibility(View.GONE); 
     } catch (Exception e) { 
      // TODO: handle exception 
     } 
    } 
} 

の問題は、私ですMainMenuアクティビティには、私は余分なものが見つかりましたが、nullです!

MainMenu   + ON RESUME + 
++ ON RESUME ++ Found Extra! 
++ ON RESUME ++ NEWVIDEO: null 

それはextras != nullチェック

私は(STEFANの答えのおかげで)それを修正HOW

を渡したことがないので、私はのonCreateでextras = intent.getExtras()電話を入れたとしても、それが呼ばれることは決してありません:logcatから

私の主な問題は、新しいギャラリーアクティビティを開始するたびにメインアクティビティが常にバックグラウンドに設定されていることでした。私のマニフェストファイルは、メインアクティビティでandroid:launchMode="singleTask"を実行するよう指示しました。だから、何らかの形でメインアクティビティが再開されたとき、アプリは常にバックグラウンドで実行されていて、インテントエクストラを通過していないので、インテントは決して通過しませんでした。だから、私はonNewIntent()メソッド呼び出しを試して、そこにあるコードを試してエキストラを受け取りました。ステファンにもう一度感謝します!

+0

使用 'startActivityForResult'と値を取得'onActivityResult' https://developer.android.com/training/basics/intents/result.html –

+0

私はこれを一度試しました。私はもう一度やり直します –

+0

前と同じ結果、余分なものが見つかりましたが、文字列はnullです。 –

答えて

1

あなたがやっていることは、ギャラリーを開いた後にもう一度MainActivityに電話することです。マニフェストで使用されているフラグによっては、メインアクティビティが2回目に開始されないことがありますが、最初のメインアクティビティは一時停止されてフォアグラウンドに持ち上げられる可能性があります。

これが原因アクティビティのライフサイクルに、そうであるならば、onCreate(...)が再び呼び出されることはありません、しかしあなたは以下のメソッドが呼び出されたかどうかを確認することができます

@Override 
protected void onNewIntent(Intent intent) { 
    super.onNewIntent(intent); 
    //TODO: check here if your intent extras arrive and log, then debug 
} 
+0

ああ、はい。私は私のマニフェストで、 'android:launchMode =" singleTask "'に設定されているアクティビティを見ています。私はonNewIntentがどのように動作するかを見てみよう。 –

+0

OnNewIntent内にログを配置しましたが、決して呼び出されません。 –

+0

私はあなたの方法を使用してこれを動作させることができました!私はそれをMainMenuのonActivityResultとギャラリーアクティビティの 'setResult();'で変更し、代わりに追加して 'startActivity(intent);を使ってonNewIntentメソッドを使用しました。 –

関連する問題