2015-10-08 15 views
15

Ho un RecyclerView e nel suo adattatore ho creato qualcosa di simile a uno OnLongClickListener, che sto chiamando uno OnEntryLongClickListener per evitare confusione.

Sto utilizzando un AlertDialog per visualizzare una finestra di dialogo con voci di elenco per diverse azioni. Tuttavia, sto ottenendo il seguente errore:

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) 

Di seguito si riporta il relativo codice che sto usando:

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); 

Così come l'XML che sto usando per la matrice:

<string-array name="quickActions"> 
    <item>Add to Favourites</item> 
    <item>More information</item> 
</string-array> 

Non sono sicuro se è importante, ma sto importando lo AlertDialog da android.support.v7.app.AlertDialog (dalla libreria di supporto v7).

Come posso risolvere questo problema?

+1

Change 'getBaseContext()' in 'AlertDialog.Builder' di un'istanza per l'istanza di attività corrente. Ad esempio, 'nuovo AlertDialog.Builder (ThisActivity.this)'. –

+0

@MikeM. Questo ha funzionato! Potresti postare questo come una risposta e * spiegare perché ha risolto il problema * - grazie. –

risposta

21

Modificare getBaseContext() nell'istanza AlertDialog.Builder nell'istanza Activity corrente. Per esempio:

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

Un AlertDialog richiede alcune risorse i cui valori sono forniti dai temi e stili allegata al Context che utilizza. Il Context restituito da getBaseContext() non ha quelli collegati, ma lo Activity lo fa. Infatti, ogni volta che è necessario un Context per un componente UI, ad esempio Dialog s, View s, Adapter s, ecc., L'attuale Activity è solitamente quello che si desidera utilizzare.

+0

Se lo chiamo da un frammento e utilizzo 'getActivity()' Ricevo ancora questo errore. Qualche idea, perché? – AdamMc331

+0

ha risparmiato un sacco di tempo. Grazie –

+0

Quindi quando si sa quando usare * Attività * o quando usare * BaseContext * – Relm

16

Prova a mettere uno stile per la vostra finestra di dialogo che si estende Theme.AppCompat.Light.Dialog.Alert

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

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

Questo funziona per me.

Saluti

+0

risolto per me, grazie! – Nickmccomb

+0

Funziona anche per me. Sembra un bug nel supporto per me. –

+0

Per me la chiave era che, se non specificassi un tema come suggerisci, il tema dell'attività doveva estendere un tema AppCompat – rupps