2015-10-08 21 views
15

私はRecyclerViewを持っていて、そのアダプタにはOnLongClickListenerと似たようなものが作成されています。混乱を避けるためOnEntryLongClickListenerと呼んでいます。

私はAlertDialogを使用して、さまざまなアクションのリスト項目を含むダイアログを表示しています。

<string-array name="quickActions"> 
    <item>Add to Favourites</item> 
    <item>More information</item> 
</string-array> 
:私は配列のために使用しています

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:以下

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) 

は、私が使用しています関連するコードです:しかし、私は次のエラーを取得しています

重要かどうかわかりませんが、(v7サポートライブラリから)からAlertDialogをインポートしています。

どうすればこの問題を解決できますか?

+1

現在のアクティビティインスタンスに 'AlertDialog.Builder'インスタンスの変更' getBaseContext() '。たとえば、 'new AlertDialog.Builder(ThisActivity.this)'となります。 –

+0

@MikeM。これはうまくいった!これを回答として掲示して*問題が解決した理由を説明してもらえますか?ありがとうございます。 –

答えて

21

AlertDialog.BuildergetBaseContext()のインスタンスを現在のActivityインスタンスにインスタンス化します。たとえば:

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

AlertDialogは、その値が使用するContextに添付テーマとスタイルで提供されている特定のリソースを必要とします。 getBaseContext()によって返されたContextには添付されていないものがありますが、Activityがあります。実際には、DialogViewAdapterなど、UIコンポーネントにContextが必要なときはいつも、現在の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

関連する問題