質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.63%

メニューは表示されるが押すとエクセプションが発生する

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 716

SmartBuzz

score 79

今回、タブページのリストビューを長押しした際に、コンテキストメニューが表示され、押すと別ページに遷移するという物を作ろうとしています。
現状フローティングボタンを押すと、その遷移がされるように確認していますが、コンテキストメニューでは表示する項目(今回だと「編集する」「削除する」は表示されますが、押すとエクセプションが発生します。

また、デバック実行をすると「onContextItemSelected」に来る前にエクセプションが発生して落ちてしまっています。

エクセプションメッセージは一番したに記載しました。

コンテキストメニューにアイテムを設定するところが悪いのでしょうか…?
教えてください。

宜しくお願い致します。

public class MylistCollectionFragment  extends Fragment implements View.OnClickListener,AdapterView.OnItemClickListener {

    private Context mContext;

    private LinearLayout mRoot;
    private ListView listView;

    private List<MylistCollection> collectionList;

    static final int MENU_ITEM_ID_EDIT = 1;
    static final int MENU_ITEM_ID_DELETE = 2;

    public static final int DATA_ENTRY = 1;
    public static final int DATA_EDIT =0;
    public static final String DATA_MYLISTFORM = "SEMD_MYLISTFORM";
    public static final String MYLISTCOLLECTIONFRAGMENT_ID ="MYLISTCOLLECTIONFRAGMENT";

    public MylistCollectionFragment(){}

    @Override
    public void onAttach(Context context){
        super.onAttach(context);
        mContext = context;
    }
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceSate){
        return inflater.inflate(R.layout.fragment_mylistcollection,container,false);
    }

    @Override
    public void onResume(){
        super.onResume();
        updateData(getActivity());
    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState){
        super.onViewCreated(view, savedInstanceState);

        mRoot = (LinearLayout)view.findViewById(R.id.root);

        listView = (ListView) view.findViewById(R.id.list_collection);
        listView.setOnItemClickListener(this);
        listView.setOnCreateContextMenuListener(this);

        FloatingActionButton fab = (FloatingActionButton) view.findViewById(R.id.fab);
        fab.setOnClickListener(this);

        updateData(getActivity());
    }

    private void updateData(final Activity activity){
~~~字数オーバーの為割愛~~~~
    }

    @Override
    public void onClick(View v){
        switch (v.getId()){
            case R.id.fab: onFabClick(getActivity()); break;
        }
    }

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        ListView listView = (ListView)parent;
        MyCollectionListAdapter adapter = (MyCollectionListAdapter) listView.getAdapter();
        MylistCollection collection = (MylistCollection) adapter.getItem(position);
        FlurryLogger.logEvent(getClass().getSimpleName() + " onClickItem" + collection.getName());
        TestListActivity.start(getActivity(), collection);
    }


    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
        AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo)menuInfo;
        ListView listView = (ListView)v;
        MyCollectionListAdapter adapter = (MyCollectionListAdapter)listView.getAdapter();
        MylistCollection mycollection = (MylistCollection) adapter.getItem(info.position);
        FlurryLogger.logEvent(getClass().getSimpleName() + " onContextMenu" + mycollection.getName());

        // タイトル
        ContextMenuHeader contextMenuHeader = new ContextMenuHeader(getContext());
        registerForContextMenu(contextMenuHeader);
        menu.setHeaderView(contextMenuHeader);

        if(!Locale.JAPAN.equals(Locale.getDefault())){
            contextMenuHeader.setTitle(mycollection.getEnglish() + "\n" + mycollection.getName());
        }else{
            contextMenuHeader.setTitle(mycollection.getName());
        }
        contextMenuHeader.setAuthor(mycollection.getType());
        contextMenuHeader.setPublisher(mycollection.getMemo());

        //メニューボタン
        menu.add(0, MENU_ITEM_ID_EDIT, 0, R.string.edit);
        menu.add(0, MENU_ITEM_ID_DELETE, 0, R.string.deleate);


    }

    @Override
    public boolean onContextItemSelected(MenuItem item) {
        AdapterView.AdapterContextMenuInfo menuInfo = (AdapterView.AdapterContextMenuInfo)item.getMenuInfo();
        ListView listView = (ListView)getView().findViewById(R.id.list_collection);
        MyCollectionListAdapter adapter = (MyCollectionListAdapter)listView.getAdapter();
        MylistCollection mycollection = (MylistCollection)adapter.getItem(menuInfo.position);
        Uri uri;

        switch(item.getItemId()) {
            case MENU_ITEM_ID_EDIT:
                FlurryLogger.logEvent(getClass().getSimpleName() + " onClickContextItemSelected Wikipedia");
                onFabClick(getActivity());
                return true;

            case MENU_ITEM_ID_DELETE:
                FlurryLogger.logEvent(getClass().getSimpleName() + " onClickContextItemSelected Official");
                onFabClick(getActivity());
                return true;
        }

        return super.onContextItemSelected(item);
    }

    /**
     * 登録ボタン
     * @param /Activity activity
     */
    private void onFabClick(final Activity activity){
        FlurryLogger.logEvent(getClass().getSimpleName() + " onClick MylistCollectionForm");

        Intent intent = new Intent(getContext(), MylistCollectionActivity.class);
        intent.putExtra(DATA_MYLISTFORM, DATA_ENTRY);
        startActivity(intent);

    }
}

    android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat= }
at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1809)
at android.app.Instrumentation.execStartActivity(Instrumentation.java:1523)
at android.app.Activity.startActivityForResult(Activity.java:4225)
at android.app.Activity.startActivityForResult(Activity.java:4183)
at android.support.v4.app.FragmentActivity.startActivityFromFragment(FragmentActivity.java:849)
at android.support.v4.app.FragmentActivity$HostCallbacks.onStartActivityFromFragment(FragmentActivity.java:907)
at android.support.v4.app.Fragment.startActivity(Fragment.java:916)
at com.tester.testcollection.fragment.CollectionListFragment.onContextItemSelected(CollectionListFragment.java:176)
at android.support.v4.app.Fragment.performContextItemSelected(Fragment.java:2085)
at android.support.v4.app.FragmentManagerImpl.dispatchContextItemSelected(FragmentManager.java:2173)
at android.support.v4.app.FragmentController.dispatchContextItemSelected(FragmentController.java:308)
at android.support.v4.app.FragmentActivity.onMenuItemSelected(FragmentActivity.java:370)
at android.support.v7.app.AppCompatActivity.onMenuItemSelected(AppCompatActivity.java:147)
at android.support.v7.view.WindowCallbackWrapper.onMenuItemSelected(WindowCallbackWrapper.java:100)
at android.support.v7.view.WindowCallbackWrapper.onMenuItemSelected(WindowCallbackWrapper.java:100)
at com.android.internal.policy.PhoneWindow$PhoneWindowMenuCallback.onMenuItemSelected(PhoneWindow.java:3663)
at com.android.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:761)
at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:152)
at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:904)
at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:894)
at com.android.internal.view.menu.MenuPopup.onItemClick(MenuPopup.java:128)

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

check解決した方法

0

ContextMenuを別で使っていて、ID1,2,3は既に使われていた。
それが原因だった。
4,5を指定すると解決した。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

TestListActivity#startがとても怪しいです。
このメソッドの前後でログ出力を行い、メソッドが完了しているかを確認してください。
また、このメソッドのコードとなにをするメソッドかを説明してください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/11/29 11:28 編集

    この先はcollectionを渡して、情報を表示する画面に遷移します。

    呼び出しているメソッドコードは
    public static void start(Activity activity, MylistCollection collection){
    Intent starter = new Intent(activity, MountainListActivity.class);
    starter.putExtra(EXTRA_COLLECTION, collection);
    ActivityCompat.startActivity(activity,
    starter,
    ActivityOptionsCompat.makeSceneTransitionAnimation(activity).toBundle());
    }
    で、画面を立ち上げるためのメソッドです。
    ただ、今回は既存の処理を取りあえず型を合わせて呼び出しているだけで、正しく動作確認はしていません。
    まずは、コンテキストメニューでの編集と削除が正確に動かないと次に進めなくて…。
    ※質問が文字数オーバーなので、コメントにコードを記載します。

    キャンセル

  • 2016/11/29 12:07

    onFabClickの冒頭にあるログ出力は行われていますか?

    キャンセル

  • 2016/11/29 13:21 編集

    はい、ログ出力は行われてます。
    その先の遷移も問題なくできています。

    onCreateContexMenuもエクセプション発生することなく、最後まで通っていて、onContextItemSelectedのところに来ていない感じです。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.63%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる