2015-10-17 36 views
5

更新:アプリを使用しているときに、いくつかのランダムな時間に、特に画面の下部に向かってアイテムをクリックするとアプリがクラッシュするようです。それがなぜ起こったのかについてのアイデアは?エスプレッソ長いメニュー項目とポップアップメニューをクリック

私のアプリにはリストビューがあります。リストビュー項目を長押しすると、長押しした項目に固定されたポップアップメニューが表示され、メニュー項目を削除または編集するオプションが表示されます。アプリを使用するだけで、すべて正常に動作します。リスト内の項目を長くクリックすると、関連する基本データが削除され、削除した項目がなくてもリストビューが最新表示されます。

私は何をしようとしています: エスプレッソは私のリストビューとロングクリックが好きではありません。私は単にポップアップメニューが表示されることをテストしようとしていますが、私はエスプレッソをlongclickにうまく乗せられません。問題はポップアップメニューと関係があると思っています。初心者にとっては、エスプレッソを私に怒らずにロングクライックにしようとしているだけです。いったんエスプレッソの長いクライストが成功すると、ポップアップが表示されるかどうかをチェックする方法がわかります。

私がこれまでに試したこと:アニメーションをオフにすると、エスプレッソのフレーク性が低下するのを助けるはずです。私は可能なすべてのアニメーションをオフにして、問題は依然として続きます。これはエスプレッソテストです :私も自分の携帯電話上のテストランを見て、それが正しいメニュー項目をlongclickingされていることがわかりますが、longclickが完了すると、ポップアップメニューが表示されます場合は、テストが

コードを失敗することができます失敗した行。私はclick()を除いて同じコード行を使用していました。アプリはそれが想定していたことを行い、エスプレッソは満足しています。 mCourseCountは、単にリスト内の最後の項目のインデックスです。それは問題ではありません。私はいくつかの他のテストで同じインデックスを更新し、すべて正常に動作します。

onData(anything()).inAdapterView(withId(R.id.listview_class))  
     .atPosition(mCourseCount).perform(longClick()); 

は障害が発生すると、私はよっぽど設定しているため、スタックトレースのこの最後のビットが混乱して

Caused by: java.lang.IllegalStateException: MenuPopupHelper cannot be used 
without an anchor at 
com.android.internal.view.menu.MenuPopupHelper.show(MenuPopupHelper.java:101) 
at android.widget.PopupMenu.show(PopupMenu.java:108)at 
com.cmsc355.classcompass.classcompass.CourseMenuFragment$2. 
onItemLongClick(CourseMenuFragment.java:91) 

android.support.test.espresso.PerformException: Error performing 'long 
click' on view ' displaying data matching: ANYTHING within adapter vieW 
matching: with id: com.cmsc355.classcompass.classcompass:id/listview_class' 

以降スタックトレースにカップル面白いラインが存在します以下のようにアンカーをポップアップメニューに追加します(これは91行目のCourseMenuFragmentからです)。

listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { 
     @Override 
     public boolean onItemLongClick(AdapterView<?> parent, final View view, final int position, long id) { 

     PopupMenu popupEdit = new PopupMenu(getActivity(), listView.getChildAt(position)); 
     popupEdit.getMenuInflater().inflate(R.menu.course_longclick_popup, popupEdit.getMenu()); 
     popupEdit.show(); 

     popupEdit.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { 
      @Override 
      public boolean onMenuItemClick(MenuItem item) { 

      if (item.getItemId() == R.id.edit_course) { 

      } else if (item.getItemId() == R.id.delete_course) { 
       throwCourseDeleteAlert(position); 
       listView.setAdapter(mCourseNameAdapter); 
      } 
      return true; 
      } 
     }); 
     return true; 
     } 
    }); 

ポップアップが初めてインスタンス化される行では、listView.getChildAt(position)がポップアップメニューのアンカーを定義します。おそらくこれに問題がありますか?しかし、言及したように、すべては私自身とちょうど対話するときに期待どおり完全に正常に動作します。

ガイダンスをいただければ幸いです。もう解明が必要な場合は教えてください。

+0

これが役に立ちます:http://stackoverflow.com/questions/24634136/menu-popup-helper-cannot-be-used-without-anchor –

答えて

3

検出された溶液。私は誤ってリスト項目にアクセスしていました。代わりに

PopupMenu popupEdit = new PopupMenu(getActivity(), listView.getChildAt(position)); 

の私は遠く、リスト内のスクロールダウンされたときのためのインデックス位置を調整しなければならなかった

PopupMenu popupEdit = new PopupMenu(getActivity(), listView.getChildAt(position - listView.getFirstVisiblePosition())); 

に変更しました。私はSOの自分の質問に答えるのは嫌ですが、これは他の人を助けるでしょう。

関連する問題