2015-04-21 13 views
11

Sınıfım böyle DialogFragment uzanır sağlamalıdır:Hata: Bu fragman bir varsayılan kurucu (bağımsız değişkenler ile halka açık bir yapıcı)

public class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener { 

    EditText editDate; 
    private Calendar dateTime = Calendar.getInstance(); 
    private SimpleDateFormat dateFormatter = new SimpleDateFormat("dd MMMM yyyy"); 

    public DatePickerFragment(EditText editText) { 
     editDate = editText; 
    } 

@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 
    // Use the current date as the default date in the picker 
    final Calendar c = Calendar.getInstance(); 
    int year = c.get(Calendar.YEAR); 
    int month = c.get(Calendar.MONTH); 
    int day = c.get(Calendar.DAY_OF_MONTH); 

    // Create a new instance of DatePickerDialog and return it 
    return new DatePickerDialog(getActivity(), this, year, month, day); 

} 

@Override 
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { 
     dateTime.set(year, monthOfYear, dayOfMonth); 
     editDate.setText(dateFormatter 
       .format(dateTime.getTime())); 
    } 

} 

Ve Aktivite bunu kullanıyorum nasıl şudur:

public void showDatePickerDialog(View v) { 
     new DatePickerFragment((EditText) v).show(getSupportFragmentManager(), "datePicker"); 
    } 

Ve böyle çağıran:

<EditText 
     android:id="@+id/editDate" 
     android:onClick="showDatePickerDialog" /> 

Ama her zaman alıyorum:

Error: This fragment should provide a default constructor (a public constructor with no arguments) 
+0

Android Parçası hep hayır arg yapıcı bir varsayılan olmalıdır yardımcı olur umarım

uzanır ekle .Gerçekten bunu göz ardı etmek istiyorsanız, IDE'nizde tiftik uyarılarını devre dışı bırakabilirsiniz. EditText'i neden geçtiğinizi anlatabilirseniz, ihtiyaçlarınızı karşılamanın birden fazla yolu olabilir. – Milan

+0

Fragmanımdan birinde Tarih Seçicisini göstermek için EditText kullanıyorum ... @Milanix – Oreo

+0

Yapabilecekleriniz, çağrı aktivitenize/parçanıza OnDateSetListener {on dateSet (Tarih tarihi);} gibi bir geriçağırım dinleyicisi uygulamaktır. Daha sonra setTargetFragment() öğesini kullanarak arayanı ayarlayabilir ve getTargetFragment iletişim parçanızdan alabilirsiniz. Ve sonra tarih seçimini tamamladığınızda, dinleyiciyi geri ver. – Milan

cevap

21

Android SDK'nın daha yeni sürümü, boş ve no-args kurucusu almanızı zorlaştırır. Şimdi bunu yapmak için iyi bir uygulama. Bu, örnek durumunu paket halinde kaydetmenize olanak tanır ve Android, varsayılan yapıcınızı çağırmak için parçanızı yeniden oluşturur. Bu durumda

, aşağıdaki çözümler var:

Birincisi, varsayılan kurucuyu oluşturun:

public DatePickerFragment() {} 

örneğini oluşturun ve ayarlayıcı yöntemi ile EditText ayarlayın:

DatePickerFragment fragment = new DatePickerFragment(); 
fragment.setEditText(v); // create this setter 
fragment.show(); 

EditText ayrıştırılabilir olduğundan, bağımsız değişken olarak da ayarlayabilirsiniz:

DatePickerFragment fragment = new DatePickerFragment(); 
Bundle bundle = new Bundle(); 
bundle.putExtra("EditText", v); 
fragment.setArguments(bundle); // setArguments is a method that already exists in fragments. 
fragment.show(getSupportFragmentManager(), "DatePicker"); 

[DÜZENLE] önerildiği gibi böyle build.gradle yapılandırarak bu hataları görmezden deneyin:

lintOptions { 
    abortOnError false 
    checkReleaseBuilds false 
} 

Bu parçalar halinde varsayılan olmayan kurucu kullanarak uygulamanızın yapı durmayacak.

+1

Burada değişiklik yapmalıyım? – Oreo

+0

Varsayılan kurucu 'DatePickerFragment' içinde oluşturun. EditText'i ayarlayıcı veya argümanlar aracılığıyla ayarlamayı seçtiniz, sizin cevabınız –

+0

Lütfen sizin önerdiğim güncellenmiş kodumu kontrol edin, – Oreo

4

Sen Fragment bir Görünüm referansı geçmesi gerektiğini

public DatePickerFragment(EditText editText) { 
    editDate = editText; 
} 

bu yapıcı kaldırmak gerekir. Bir EditText'i Aktivitede veya başka bir yerde güncellemek istiyorsanız, dinleyiciyi kullanın. ne zaman ki bu helps..what tam burada yapıyorum needful..another şekilde yapmak için localBroadcast kullanıyor

+0

Neden bir Fragman veya Etkinlik kurucusunun bir üyesi olarak Views'a geçmememiz gerektiğini söyleyebilir misiniz? ve sadece Görüntüleme mi? Bunun kötü bir Java kodlama uygulaması değil kötü bir Android uygulaması olduğunu mu anladım? – Muddz

+1

İlk önce Fragment kurucusunu, dönemini özelleştirmemelisiniz. [Http://stackoverflow.com/questions/10450348/do-fragments-really-need-an-empty-constructor]. Ve verileri yalnızca Görüntülemeye değil Fragment'e iletmelisiniz. Niye ya ? Yaşam döngüsü nedeniyle. Bir görünümü güncelleyen uzun bir süreci (dinlenme api gibi) çalıştırırken, görünümün zaten devam etmesi mümkündür, çünkü onu tutan etkinlik veya parça tahrip olmuştur. Bu size Null Pointer Exc verecek. Yani görüntüleme etkileşimi null çek ile dinleyici ile yapılmalıdır. Ancak bugün daha iyi bir yol, Event Bus/Otto kütüphanelerini kullanmaktır. – inmyth

1
 public DatePickerFragment() {} 

     @Override 
     public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { 
       dateTime.set(year, monthOfYear, dayOfMonth); 
      // editDate.setText(dateFormatter 
      //   .format(dateTime.getTime())); 
      Intent intent = new Intent(); 
      intent.setAction("CUSTOM_INTENT_FOR_SETTING_EDITTEXT"); 
      Bundle bundle = new Bundle(); 
      bundle.putString("my_data", dateTime.getTime.toString()); 
      intent.putExtras(bundle); 
      sendBroadcast(intent); 
      } 




public class SubmitFragment extends Fragment { 

    View view; 
    EditText editDate; 
    String strDate; 
    Button btnSubmit; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     view = inflater.inflate(R.layout.fragment_submit, container, false); 

     editDate = (EditText) view.findViewById(R.id.editDate); 

     btnSend = (Button) view.findViewById(R.id.buttonSend); 
     btnSend.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       strDate = editDate.getText().toString(); 
       Log.v("strDate..... >>>", strDate); 

      } 
     }); 

     return view; 
    } 


     // Our handler for received Intents. This will be called whenever an Intent 
     // with an action named "CUSTOM_INTENT_FOR_SETTING_EDITTEXT" is broadcasted. 
     private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() { 
      @Override 
      public void onReceive(Context context, Intent intent) { 
      // Get extra data included in the Intent 
      String message = intent.getStringExtra("my_data"); 
      Log.d("receiver", "message: " + message); 
     *****// Use this message to set Edittext here...***** 
      } 
     }; 


     @Override 
     protected void onPause() { 
      // Unregister since the activity is about to be closed. 
      LocalBroadcastManager.getInstance(getactivity()).unregisterReceiver(mMessageReceiver); 
      super.onDestroy(); 
     } 


     @Override 
     protected void onResume() { 
      // register the receiver here.. 
     super.onResume(); LocalBroadcastManager.getInstance(getactivity()).registerReceiver(mMessageReceiver, 
       new IntentFilter("CUSTOM_INTENT_FOR_SETTING_EDITTEXT")); 
     } 
} 

Umut bu yaklaşımı hakkında setText ama bir yanlış şey bir arayüz kullanarak olurdu Uygulama uzunluğunda arka planda, oncreateview yeniden çağrıldığında null döndürecektir.

+0

çok temiz bir fikir, ancak benim için karışıklıklar, hala ana Etkinlik içinde showDatePickerDialog (Görüntüle v) {...} kullanıyorum, ancak kullanıcı benim Fragmentimden birinin xml'sinde EditText'e tıkladığında bu yöntemi çağırıyor .. t Etkinlik ve Parça (nerede EditText'im var) yerleştirileceği ve yerleştirileceği yer bu yüzden, hem sınıflar hem de ana Etkinlik ve Fragman kodlarını yayınladım, kodunuzu kontrol edip güncellemeliyim ... – Oreo

+0

, 'editPartyDate' içinde tanımlanmıştır activity_main.xml? –

+0

no Fragment, ben şimdi daha net parça kodu koymuş, şimdi kontrol edin – Oreo

0

@SuppressLint ("ValidFragment") kendi sınıfındaki önce

,

public class DatePickerFragment ben bunu

İlgili konular