2014-01-31 3 views
1

Я добавляю возможность загрузки видео в дополнение к фотографиям в моем приложении. Чтобы выполнить это, теперь, когда вы нажимаете кнопку attach b2 вместо загрузки изображения, он загружает диалоговое окно предупреждения showDialog(), чтобы спросить, какую вы хотите загрузить (видео или фотографию) после выбора, затем загружает изображение или селектор видео. Проблема возникает, когда вы вызываете метод doPositiveClick(Activity activity, int requestCode) из внутреннего класса onActivityResult не запускается и данные не возвращаются. Я чувствую, что это связано с тем, что он вызван из внутреннего класса MyAlertDialogFragment, но я не уверен, как с ним справиться. Спасибо.onActivityResult не является триггером из диалогового окна оповещений FIXED

public static final int REQUEST_CODE = 0, RESULT_PHOTO = 1, RESULT_VID = 2; 


    void showDialog() { 
     DialogFragment newFragment = MyAlertDialogFragment.newInstance(
       R.string.alert_dialog_two_buttons_title); 
newFragment.setTargetFragment(ChatRoomFragment.this, REQUEST_CODE);    
newFragment.show(getFragmentManager(), "dialog"); 

    } 





    @Override 
    if(requestCode == REQUEST_CODE && data.getData() != null) { 

     Log.v("response", "Photo Selected"); 


        Uri _uri = data.getData(); 
        Log.v("response", "cp1/4"); 

Кодекс делает его к этой точке ^^^^ b2.setImageResource (R.drawable.picattached);

if (_uri != null) { 
         //User has pick an image. 
         Cursor cursor = getActivity().getContentResolver().query(_uri, new String[] { android.provider.MediaStore.Images.ImageColumns.DATA }, null, null, null); 
         //cursor.moveToFirst(); 
         if (cursor == null){ 
         uploadMsgPic = _uri.getPath(); 
         Log.i("response", "cursor == null"); 
         Log.i("response", "uploadMsgPic now = " + uploadMsgPic); 
         }else{ 
          Log.i("response", "cursor = "+ cursor); 
         cursor.moveToFirst(); 
         Log.v("response", "cp2/4"); 
         //Link to the image 
         //cursor.moveToFirst(); 
         final String imageFilePath = cursor.getString(0); 
         Log.i("response", "imageFilePath == " + imageFilePath); 
         Log.v("response", "cp3/4"); 
         uploadMsgPic = imageFilePath; 
         Log.v("response", "4/4"); 
         cursor.close(); 
         if (uploadMsgPic == null) 
         uploadMsgPic = _uri.getPath(); 
         } 
         Log.i("response", "uploadMsgPic == " + uploadMsgPic); 
         media_attached=true; 



        } 

       } 
      if(requestCode == 6 && data != null && data.getData() != null){ 
       Uri _uri = data.getData(); 
       Log.v("response", "cp1/4"); 
       b2.setImageResource(R.drawable.picattached); 
       if (_uri != null) { 
        //User has pick an image. 
        Cursor cursor = getActivity().getContentResolver().query(_uri, new String[] { android.provider.MediaStore.Images.ImageColumns.DATA }, null, null, null); 
        //cursor.moveToFirst(); 
        if (cursor == null){ 
        uploadMsgPic = _uri.getPath(); 
        Log.i("response", "cursor == null"); 
        Log.i("response", "uploadMsgPic now = " + uploadMsgPic); 
        }else{ 
         Log.i("response", "cursor = "+ cursor); 
        cursor.moveToFirst(); 
        Log.v("response", "cp2/4"); 
        //Link to the image 
        //cursor.moveToFirst(); 
        final String imageFilePath = cursor.getString(0); 
        Log.i("response", "imageFilePath == " + imageFilePath); 
        Log.v("response", "cp3/4"); 
        uploadMsgPic = imageFilePath; 
        Log.v("response", "4/4"); 
        cursor.close(); 
        if (uploadMsgPic == null) 
        uploadMsgPic = _uri.getPath(); 
        } 
        Log.i("response", "uploadMsgPic == " + uploadMsgPic); 
        media_attached=true; 

       } 

      } 

      super.onActivityResult(requestCode, resultCode, data); 
    } 


//Generics: 
//1. Long: Type of reference(s) passed to doInBackground() 
//2. String: Type of reference passed to onProgressUpdate() 
//3. STRING: Type of reference returned by doInBackground() 
//Value passed to onPostExecute() 





    public static void doPositiveClick(Activity activity, int requestCode) { 
     Log.i("ChatRoomFragMent", "doPositive Clicked"); 
     Intent intent = new Intent(); 
     intent.setType("image/*"); 
     intent.setAction(Intent.ACTION_GET_CONTENT); 
     activity.startActivityForResult(Intent.createChooser(intent, "Select Picture"), REQUEST_CODE); 



     // Do stuff here. 
     Log.i("ChatRoomFragMent", "picture selector loaded"); 
    } 

    public void doNegativeClick() { 

     Intent intent = new Intent(); 
     intent.setType("video/*"); 
     intent.setAction(Intent.ACTION_GET_CONTENT); 
     startActivityForResult(Intent.createChooser(intent, "Select Video"), RESULT_VID); 


     // Do stuff here. 
     Log.i("FragmentAlertDialog", "Negative click!"); 
    } 

    public static class MyAlertDialogFragment extends SherlockDialogFragment { 

     public static MyAlertDialogFragment newInstance(int title) { 
      MyAlertDialogFragment frag = new MyAlertDialogFragment(); 
      Bundle args = new Bundle(); 
      args.putInt("title", title); 
      frag.setArguments(args); 
      return frag; 
     } 


     @Override 
     public Dialog onCreateDialog(Bundle savedInstanceState) { 
      int title = getArguments().getInt("title"); 
      return new AlertDialog.Builder(getActivity()) 
        //.setIcon(R.drawable.alert_dialog_icon) 
        .setTitle(title) 
        .setPositiveButton("Photo", 
         new DialogInterface.OnClickListener() { 
          public void onClick(DialogInterface dialog, int whichButton) { Intent data = new Intent(); 

          //((FragmentAlertDialogSupport)getActivity()).doPositiveClick(); 
          ChatRoomFragment.doPositiveClick(getActivity(), 5); 
          getTargetFragment().onActivityResult(getTargetRequestCode(), RESULT_PHOTO, data); 
         } 
         } 
        ) 
        .setNegativeButton("Video", 
         new DialogInterface.OnClickListener() { 
          public void onClick(DialogInterface dialog, int whichButton) { 
           //((FragmentAlertDialogSupport)getActivity()).doNegativeClick(); 
           //doNegativeClick(); 
          } 
         } 
        ) 
        .create(); 
     } 
    } 
} 
+0

Священный код! Как насчет того, чтобы начать с * просто * ваш 'onActivtiyResult()' и ваш 'AlertDialog'? – codeMagic

+0

Возможно, вы не вызываете super.onActivityResult() в своей реализации Activity.onActivityResult? – marcinj

+0

извините. Я рубил его. – TWeeKeD

ответ

1

Необходимо установить целевой фрагмент для своего диалога. для этого добавьте строку перед тем, как вы откроете диалог:

newFragment.setTargetFragment(ChatRoomFragment.this, REQUEST_CODE); 

в пределах вашего шоуDialog метод. Это скажет вашему диалогу, какой фрагмент должен получить результат активности.

Кроме того, определить три константы:

public static final int REQUEST_CODE = 0, RESULT_PHOTO = 1, RESULT_VID = 2; 

Теперь в вашем диалоге, вы должны делать что-то вдоль линий:

...setPositiveButton("Photo", 
    new DialogInterface.OnClickListener() { 
     public void onClick(...) { 
      Intent data = new Intent(); 
      getTargetFragment().onActivityResult(getTargetRequestCode(), RESULT_PHOTO, data); 
     }}) 
.setNegativeButton(... 
      getTargetFragment().onActivityResult(getTargetRequestCode(), RESULT_VID, data); ... 

Тогда в вашем методе onActivityResult, что вам нужно сделать проверка кода запроса и пар кодов результатов:

if(requestCode == REQUEST_CODE && resultCode == RESULT_PHOTO) { doPositiveClick(); } ... 
+0

Спасибо. Но у меня есть вопрос. не является ли Requeset_code не установленным, пока после завершения выбора изображения? должен ли я установить 'REQUEST_CODE' в методе doPositive? – TWeeKeD

+0

'REQUEST_CODE = 5;' – TWeeKeD

+0

REQUEST_CODE - это тег, который по существу связан с результатом диалога. То есть. когда вы устанавливаете REQUEST_CODE для цели, ваше диалоговое окно будет отвечать на этот запрос своими данными. – GrouchyPanda