2013-10-10 20 views
5

Şimdi birkaç saatliğine kafamı bulamaya çalışıyorum.Ana faaliyete dönüş değeri elde etmek için Dialog'u başlatın

Ana Fragman sınıfım var, sonra onClick'ten bu sınıftaki bir ImageView'dan ayarladım, basit bir "Evet" veya "İptal" seçeneğiyle bir Diyalog Fragmanı başlatıyorum.

Kullanıcı "Tamam" ı tıklattığında, daha sonra bazı kodları çalıştırmak için ana Fragmanma bir Sonuç kodu gönderecek (Bu durumda, duvar kağıdı ayarlıyorum).

Bu ses basit ama anlaşılıyor gibi görünmüyor. Şimdiden teşekkürler.

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 

    final View v = inflater.inflate(R.layout.image_detail_fragment, 
      container, false); 

    mImageView = (RecyclingImageView) v.findViewById(R.id.imageView); 
    mImageView.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View arg0) { 

      MyDialogFragment dialog = new MyDialogFragment(); 
      dialog.show(getActivity().getFragmentManager(), 
        "MyDialogFragment"); 

     } 

     public void onDialogOKPressed() { 

    ((ImageDetailFragment) (DialogFragment.this.getParentFragment())) 
        .onDialogOKPressed(); 
      dismiss(); 

     } 
    }); 

    return v; 
} 

iletişim sınıf: ben bir şekilde geri sonuç almak istiyoruz

Onclick etkinlik olarak

class MyDialogFragment extends DialogFragment { 
    private Button ButtonOk; 
    private Button ButtonCancel; 

    public MyDialogFragment() { 

    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.prompt, container); 
     ButtonOk = (Button) view.findViewById(R.id.button1); 
     ButtonCancel = (Button) view.findViewById(R.id.button2); 
     getDialog().setTitle("Set Wallpaper?"); 

     ButtonOk.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 

               ((MyDialogFragment)(DialogFragment.this.getActivity())).onDialogOKPressed(); 
       dismiss(); 


      } 

     }); 

     ButtonCancel.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 

       MyDialogFragment.this.dismiss(); 

      } 
     }); 

     return view; 

    } 
} 

cevap

4

, OK düğmesine basılmasını yanıt veren yöntemi ekleyin, public void onDialogOKPressed() gibi.

public void onClick(View v){ 
    ((MyActivity)(DialogFragment.this.getActivity())).onDialogOKPressed(); 
    dismiss(); 
} 

veya ana fragmanı içine yeni bir yöntem koymak ve bunu: Sonra, DialogFragment da Tamam düğmesinin OnClickListener içinde Bunu yapmak

public void onClick(View v){ 
    ((MyMainFragment)(DialogFragment.this.getParentFragment())).onDialogOKPressed(); 
    dismiss(); 
} 
+0

Öyleyse, ana etkinliğin kodumu yürütmesini bilmesi için sonucu nasıl almam gerekiyordu? Bu benim sorum oldu :) – Jack

+0

Bu sadece etkinliğinizde yeni yönteminizi çağırır. Bu yüzden kodunuzu bu yeni yöntemden çalıştırın. Tamam düğmesine basılmazsa çağrılmaz. Sonuç kodu ile if/else bloğundan kurtulun. Duvar kağıdını ayarlamayı planladığınıza göre, yeni yöntemde duvar kağıdınızı ayarlayın. – Tenfour04

+0

Alternatif olarak, yeni yöntemi parçanıza yerleştirebilir ve '((MyActivity) getActivity())' i ((MyFragment) getParentFragment()) 'ile değiştirebilirsiniz. – Tenfour04

2

; özellikle ilk yöntem. Bu yöntemin kullanılması, Fragment'un kullanım amacını esasen yenerek, MyDialogFragment ve MyActivity arasında sıkı bir bağlantı kuracaktır. Bir Fragment sadece Activity'a bağlı olduğunu bilmelidir, ne tür bir Activity olduğunu değil.

İkinci yöntem sizin Activity zaten ben hala kullanarak daha iyi bir yöntem olduğunu düşünüyorum, kullanacağı Fragment ne tür bilir düşünüldüğünde değil kadar kötü olsa da bir interface:

public class MyDialogFragment extends DialogFragment { 

    public interface OnOkButtonClickListener { 
     void onOkButtonClick(); 
    } 

    private OnOkButtonClickListener mOnOkButtonClickListener; 

    private Button mOkButton; 
    private Button mCancelButton; 

    public static MyDialogFragment newInstance() { 
     return new MyDialogFragment(); 
    } 

    @Override 
    public void onAttach(Context context) { 
     super.onAttach(context); 

     if(context instanceof OnOkButtonClickListener) { 
      mOnOkButtonClickListener = (OnOkButtonClickListener) context; 
     } 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.prompt, container, false); 
     getDialog().setTitle("Set Wallpaper?"); 

     mOkButton = (Button) view.findViewById(R.id.button1); 
     mCancelButton = (Button) view.findViewById(R.id.button2); 

     mOkButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if(mOnOkButtonClickListener != null) { 
        mOnOkButtonClickListener.onOkButtonClick(); 
       } 
      } 
     }; 

     mCancelButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       MyDialogFragment.this.dismiss(); 
      } 
     }; 
    } 

} 

Sonra yapabilirsiniz uygulanması interfaceActivity herhangi:

public class MyActivity extends AppCompatActivity 
     implements MyDialogFragment.OnOkButtonClickListener { 


    @Override 
    public void onOkButtonClick() { 
     // TODO: handle dialog click 
    } 

    // ... 

} 

Bu daile iletişim kurmak için önerilen yöntem developer training site numaralı telefondan.