2015-10-08 4 views
15

У меня есть RecyclerView, и в его адаптере я создал нечто похожее на OnLongClickListener, которое я вызываю OnEntryLongClickListener, чтобы избежать путаницы.

Я использую AlertDialog для отображения диалога со списком элементов для разных действий. Тем не менее, я получаю следующее сообщение об ошибке:

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) 

Ниже приведен соответствующий код, я использую:

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

Как и XML я использую для массива:

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

Я не уверен, если это имеет значение, но я импортирую AlertDialog из android.support.v7.app.AlertDialog (из библиотеки поддержки v7).

Как я могу решить эту проблему?

+1

Изменения 'getBaseContext()' в 'AlertDialog.Builder' экземпляра к текущему экземпляру активности. Например, «новый AlertDialog.Builder (ThisActivity.this)». –

+0

@MikeM. Это сработало! Не могли бы вы опубликовать это как ответ и * объяснить, почему он решил проблему *, а также - спасибо. –

ответ

21

Изменение getBaseContext() в AlertDialog.Builder экземпляр экземпляра Activity. Например:

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

AlertDialog An требует определенных ресурсов, значения которых обеспечивается тем и стилей, прикрепленных к Context он использует. Context возврат getBaseContext() не прилагается, но Activity делает. Действительно, всякий раз, когда требуется Context для компонента пользовательского интерфейса - например, Dialog s, View s, Adapter и т. Д. - обычно используется ток Activity, который вы хотите использовать.

+0

Если я вызываю это изнутри фрагмента и использую 'getActivity()', я все равно получаю эту ошибку. Любые идеи почему? – AdamMc331

+0

сэкономил много времени. Спасибо –

+0

Итак, когда вы знаете, когда использовать * Деятельность * или когда использовать * BaseContext * – Relm

16

Попробуйте положить стиль для диалога, который расширяет Theme.AppCompat.Light.Dialog.Alert

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

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

Это работает для меня.

Привет

+0

исправил его для меня, спасибо! – Nickmccomb

+0

Работает для меня тоже. Похож на ошибку в lib для меня. –

+0

Для меня ключевым было то, что если я не укажу тему, как вы предлагаете, тема действия должна была расширить тему AppCompat – rupps

Смежные вопросы