2016-05-08 18 views
0

MainActivityのFragment(TrainerSettings)のボタンをクリックするとDialogFragment(SettingsBackImageDialog)が開きます。 SettingsBackImageDialogにはいくつかのボタンがあり、そのうちの1つは撮影のためのもので、フラグメントのImageview(trainersettingsmainicon)に設定されています。ダイアログのAndroid onActivityResult

私はでTrainerSettingsSettingsBackImageDialogを開く:

public void onViewCreated (View view, Bundle savedInstanceState) {  
      view.findViewById(R.id.trainersettingsbackgroundbtn).setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        showEditbackImageDialog(); 
       } 
      }); 
     } 

private void showEditbackImageDialog() { 
     android.support.v4.app.FragmentManager fm = getActivity().getSupportFragmentManager(); 
     SettingsBackImageDialog settingsBackImageDialog = SettingsBackImageDialog.newInstance("Wybierz pierwszy kolor"); 
     settingsBackImageDialog.show(fm, "SettingsBackImageDialog"); 
    } 

SettingsBackImageDialogから私のコードは次のとおりです。

MainActivity
public class SettingsBackImageDialog extends DialogFragment { 

     int REQUESTCODE=1; 

     public SettingsBackImageDialog() { 
     } 

     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, 
           Bundle savedInstanceState) { 
      return inflater.inflate(R.layout.settingsbackgroundimgdialog, container); 
     } 

     @Override 
     public void onViewCreated(final View view, @Nullable Bundle savedInstanceState) { 
      super.onViewCreated(view, savedInstanceState); 

      view.findViewById(R.id.takephotobtn).setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
        startActivityForResult(i, REQUESTCODE); 
       } 
      }); 

      String title = getArguments().getString("txt", "txt"); 
      getDialog().setTitle(title); 
      getDialog().getWindow().setSoftInputMode(
      WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); 
     } 


     public void onActivityResult(int requestCode, int resultCode, Intent data) { 
      Toast.makeText(getActivity(), "before", Toast.LENGTH_LONG).show(); 
      if(requestCode==REQUESTCODE & resultCode== Activity.RESULT_OK){ 
       Bundle bundle = new Bundle(); 
       bundle = data.getExtras(); 
       Bitmap bitmap = (Bitmap)bundle.get("data"); 
       ImageView img = (ImageView) getActivity().findViewById(R.id.trainersettingsmainicon); 
       img.setImageBitmap(bitmap); 
       Toast.makeText(getActivity(), "in", Toast.LENGTH_LONG).show(); 
      } 
     } 

    } 

public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.MainContainer); 
    fragment.onActivityResult(requestCode, resultCode, data); 
    Toast.makeText(getApplicationContext(), "im here", LENGTH_SHORT).show(); 
} 

アプリケーションがカメラを開き、私はpitureを取ることができ、それを "受け入れる"が、何も起こらない。おそらくアプリケーションはonActivityResultメソッドを使用しません(私はこのメソッドでメッセージを書き込もうとしますが、何も起こりません)。 AndroidMonitorで

05-09 02:43:50.299 9709-10068/com.hgyghyfghyu.apkana40 W/GooglePlayServicesUtil: Google Play services out of date. Requires 8115000 but found 5089070 
05-09 02:43:50.339 9709-9709/com.hgyghyfghyu.apkana40 W/EGL_emulation: eglSurfaceAttrib not implemented 

私はアンドロイド携帯電話をエミュレートするためのNOxアプリを使用しています。

問題を解決するにはどうすればよいですか?

答えて

0

選択された回答hereは問題を正確に解決します。 onActivityResultの処理対象に関する問題を解決するthis answerもチェックする必要があります。

@Override 
public void onViewCreated(final View view, @Nullable Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 
    view.findViewById(R.id.takephotobtn).setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
       //changed getActivity().startActivityForResult(i, REQUESTCODE); to: 
       startActivityForResult(i, REQUESTCODE); 
      } 
     }); 

     String title = getArguments().getString("txt", "txt"); 
     getDialog().setTitle(title); 
     getDialog().getWindow().setSoftInputMode(
     WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); 
    } 

onActivityResult()Activity上で最初に起動されます。 私の提案は、次のようにあなたのコードを変更することです。その後、アクティビティでsuper.onActivityResult()に電話すると、Fragmentsに届きます。したがってFragmentにあるものを呼び出すことができるように、onActivityResultコールバックをActivityに追加する必要があります。その一度

public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
} 

が、行われている自分のフラグメントのonActivityResultが呼び出されます、あなたが期待するようにコードが実行されます。あなたが密接に

+0

だから私はsuper.super.onActivityResult(requestCode、resultCodeが、データ)を使用してください関連これら二つを見てする必要があります

public void onActivityResult(int requestCode, int resultCode, Intent data) { if(requestCode==REQUESTCODE & resultCode== Activity.RESULT_OK){ Bundle bundle = new Bundle(); bundle = data.getExtras(); Bitmap bitmap = (Bitmap)bundle.get("data"); ImageView img = (ImageView) getActivity().findViewById(R.id.trainersettingsmainicon); img.setImageBitmap(bitmap); } } 

。 MainActivityで 'SettingsBackImageDialog'とonActivityResultでif()を使用していますか? – barmi

+0

いいえ、あなたのMainActivityのonActivityResultで 'super.onActivityResult ...'を呼び出す必要があります。あなたのフラグメントのonActivityResultに既にあるコードは良いです。変更/移動する必要はありません。 – ishmaelMakitla

+0

これは動作しません( 'SettingsBackImageDialog'のonActivityResultはまだ使用されていません)。これはDialogFragmentであり、フラグメントではないという問題はありますか? – barmi

関連する問題