2015-10-08 22 views
15

Bir RecyclerView var ve onun bağdaştırıcısında, OnLongClickListener, ben bir karışıklık önlemek için bir OnEntryLongClickListener çağıran bir şey yarattık.

Farklı eylemler için liste öğelerini içeren bir iletişim kutusu görüntülemek için AlertDialog kullanıyorum.

<string-array name="quickActions"> 
    <item>Add to Favourites</item> 
    <item>More information</item> 
</string-array> 
: Ben dizi için kullanıyorum

adapter.setOnEntryLongClickListener(new RVAdapter.OnEntryLongClickListener() { 
    @Override 
    public void onEntryLongClick(View view, int position) { 
     final MiniEntry thisEntry = entryList.get(position); 
     AlertDialog.Builder builder = new AlertDialog.Builder(getBaseContext()); 
     builder.setTitle(thisEntry.getEntryName());); 
     builder.setItems(R.array.quickActions, new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int which) { 
       // Other code here 
      } 
     }); 
     AlertDialog alert = builder.create(); // The error log points to this line 
     alert.show(); 
    } 
}); 
mRecyclerView.setAdapter(adapter); 

yanı sıra XML: Aşağıda

E/AndroidRuntime: android.content.res.Resources$NotFoundException: Resource ID #0x0 
    at android.content.res.Resources.getValue(Resources.java:2345) 
    at android.content.res.Resources.loadXmlResourceParser(Resources.java:3910) 
    at android.content.res.Resources.getLayout(Resources.java:2161) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:413) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:366) 
    at android.support.v7.app.AlertController$AlertParams.createListView(AlertController.java:734) 
    at android.support.v7.app.AlertController$AlertParams.apply(AlertController.java:711) 
    at android.support.v7.app.AlertDialog$Builder.create(AlertDialog.java:883) 
    at com.mycompany.myapp.ThisActivity$2.onEntryLongClick(ThisActivity.java:135) 
    at com.mycompany.myapp.adapter.RVAdapter$RVViewHolder.onLongClick(RVAdapter.java:41) 
    at android.view.View.performLongClick(View.java:5236) 

kullanıyorum alakalı kodu: Ancak, aşağıdaki hatayı alıyorum

Önemli olup olmadığından emin değilim, ancak android.support.v7.app.AlertDialog'dan (v7 Destek Kitaplığı'ndan) AlertDialog'u içe aktarıyorum.

Bu sorunu nasıl çözebilirim?

+1

değiştirme 'getBaseContext() 'mevcut Aktivite örneğine' AlertDialog.Builder' örnekleme olarak. Örneğin, 'yeni AlertDialog.Builder (ThisActivity.this)'. –

+0

@MikeM. Bu işe yaradı! Bunu bir cevap olarak gönderebilir misiniz? * Sorunu neden çözdüğünü * açıklayınız - teşekkürler. –

cevap

21

Geçerli Activity örneğinin AlertDialog.Builder örneğinde getBaseContext() örneğini değiştirin. Örneğin:

AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); 

bir AlertDialog

, değerleri kullandığı Context bağlı temalar ve stiller tarafından sağlanmaktadır belli kaynaklar gerektirir. getBaseContext() tarafından döndürülen Context eki yok, ancak Activity yapar. Gerçekten de, bir UI bileşeni için bir Context'a ihtiyaç duyulduğunda - örneğin, Dialog s, View s, Adapter s, vs. - mevcut Activity, genellikle kullanmak istediğinizdir. Theme.AppCompat.Light.Dialog.Alert

<style name="MyDialogTheme" parent="Theme.AppCompat.Light.Dialog.Alert" />

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), R.style.MyDialogTheme); 

uzanır senin Dialog için bir stil koyarak

+0

Bunu bir parçadan çağırırsam ve 'getActivity()' işlevini kullanırsam hala bu hatayı alıyorum. Herhangi bir fikir neden? – AdamMc331

+0

çok zaman kazandı. Teşekkürler –

+0

Peki ne zaman kullanılacağını bilen * Etkinlik * ya da * BaseContext * – Relm

16

deneyin Bu benim için çalışıyor.

Selamlar

+0

kullanmak için ne zaman kullanacağım, teşekkürler! – Nickmccomb

+0

Benim için de çalışıyor. Bana destek kütüphanesinde bir hata gibi görünüyor. –

+0

Benim için anahtar, önerdiğiniz gibi bir tema belirtmezsem, etkinlik temasının bir AppCompat temasını genişletmesi gerektiğiydi. – rupps