2016-04-07 12 views
0

Bunları denir bilmiyorum ama böyle bir şey değiştirmek istiyorum:Dahili işlevleri kendi işlevlerine nasıl değiştirebilirim?

fab.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) 
        .setAction("Action", null).show(); 
     } 
    }); 

şey haline kod böyle argümanı içinde "iç içe" olmadığı. Başka bir deyişle ne aklınızda olan geçerli:

fab.setOnClickListener(something goes here); 

//...and then within its own method somewhere, 

public void onClickMethodForOnClickListenerOrSomething(View view) { 
    Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) 
    .setAction("Action", null).show(); 
} 

Anlatabildim yapıyorum hiçbir fikrim yok ama temelde bir argüman olarak dinleyicisi söküp ayrı fonksiyonu haline yapmak istiyorum. İşleri daha temiz hale getirdiğini, çünkü çok fazla dinleyici ile OnCreate yöntemimde bir çok kodun biriktiğini fark ettim.

cevap

3

onClick yöntemini geçersiz kılmak üzere ihtiyaç, bunu adlandırmak değil, ancak folliwing yapabilirsiniz yana: Java 8 kullanıyorsanız

public void onClickMethodForOnClickListenerOrSomething(View view) { 
    Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) 
    .setAction("Action", null).show(); 
} 

public void yourOtherMethod() { 
    fab.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      onClickMethodForOnClickListenerOrSomething(view); 
     } 
    }); 
} 
0

sadece

fab.setOnClickListener(ClassName::onClickMethodForOnClickListenerOrSomething); 

Eğer yazabilir size sadece View.OnClickListener

2

yöntem fab.setOnClickListener()bir Nesne bekliyor içinde senin onClickMethodForOnClickListenerOrSomething çağırabilir değildir 210.

Dolayısıyla, bir seçenek View.OnClickListener'dan başlayan ve onClick() yöntemini geçersiz kılan yeni bir sınıf oluşturmaktır. Sonra

fab.setOnClickListener(new MyOnClickListener()); 

gibi bir şey yapabilirsiniz Diğer seçenek Sen OnClickListener bir arayüze sahip

fab.setOnClickListener((View view)->(Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) 
        .setAction("Action", null).show())); 
0

gibi bir şey bu yüzden lambdas kullanmaktır. Bu arayüzün bir Görünüm (veya türevleri) tarafından uygulanması gerekiyor. Sorunuzdaki ilk örnek, bir arayüzün satır içi uygulamasının. Onu kendi sınıfında uygulayan bir görünüme değiştirmek/hareket ettirmek istediğinizi varsayalım. Böyle bir şey:

public class Fab implements OnClickListener { 

    @Override 
    public void onClick(View v) { 
     Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) 
     .setAction("Action", null).show(); 
    } 

} 

kullanımı:

Fab fab = new Fab() 
fab.setOnClickListener(aView); 
İlgili konular