Android: Fragment's onOptionsItemSelected doesn't get called

不羁的心 提交于 2019-12-23 17:27:10

问题


I have an ActionBarActivity and one Fragment. The Activity has no menu inflated, while the Fragment has a menu with two buttons. Fragment menu is visible, but the buttons don't react at all when tapped. At debugging I can see that both onCreateOptionsMenu() for Fragment and Activity get called, but when tapping buttons no onOptionsItemSelected() gets called, neither from Activity nor from Fragment.

Activity

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    return super.onCreateOptionsMenu(menu);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    return false;
}

Fragment

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    mainActivity = (NavigationActivity)getActivity();

    setHasOptionsMenu(true);
}

 @Override
public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState){
    return (ScrollView) inflater.inflate(R.layout.tutoring_detail, container, false);
}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.query_details_menu, menu);

    super.onCreateOptionsMenu(menu, inflater);

}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.accept_query:
            respondToQuery(true);
            return true;
        case R.id.decline_query:
            respondToQuery(false);
            return true;
        default:
            break;
    }

    return false;
}

Menu to be displayed in Fragment

<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"

<item
    android:id="@+id/accept_query"
    android:orderInCategory="100"
    app:showAsAction="always"
    android:checkable="true"
    style="?android:attr/borderlessButtonStyle"
    app:actionViewClass="android.widget.ImageButton"/>

<item
    android:id="@+id/decline_query"
    android:orderInCategory="101"
    app:showAsAction="always"
    android:checkable="true"
    style="?android:attr/borderlessButtonStyle"
    app:actionViewClass="android.widget.ImageButton"/>
</menu>

回答1:


In the Activity class,

 @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        super.onOptionsItemSelected(item);   
                return false;
}

In the Fragment,

@Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(true);
    }

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {

    super.onCreateOptionsMenu(menu, inflater);

}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    Toast.makeText(getActivity(), "called " + item.getItemId(), Toast.LENGTH_SHORT).show();
    return super.onOptionsItemSelected(item);
}



回答2:


You must use super.onOptionsItemSelected(item) in the parent activity's onOptionsItemSelected(...) method.

From Activity | Android Developers:

Derived classes should call through to the base class for it to perform the default menu handling.




回答3:


Try moving setHasOptionsMenu(true) inside of the onCreateView() method in your Fragment instead of onCreate().




回答4:


I had a similar issue after making special layout for my action button (I made an Image Button and needed to pad it and change some other things so I had to use layout for it). Then onOptionsItemSelected lost connection with this imageButton so I just use clickListener for it inside onCreateOptionsMenu. It might not be the best practice, maybe there is a better solution, but this is what solve my problem.

public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    super.onCreateOptionsMenu(menu, inflater);
    inflater.inflate(R.menu.picker_list_menu, menu);

    MenuItem itemDone = menu.findItem(R.id.menu_done);
    MenuItemCompat.setActionView(itemDone, R.layout.menu_layout_done);
    menuDoneIB = (ImageButton) MenuItemCompat.getActionView(itemDone);
    itemDone.getActionView().setOnClickListener(new View.OnClickListener() {
       @Override
       public void onClick(View v) {
            //your code..
       }
     });
 }



回答5:


Try using oncreateview

public static class ExampleFragment extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.example_fragment, container, false);
    }
}



回答6:


If you have dynamically changed menu item, for instance, a badge menu (https://stackoverflow.com/a/16648170/2914140 or https://stackoverflow.com/a/26017587/2914140), you should initialize the item in onCreateOptionsMenu and re-set setOnClickListeners after every change of the item. In my case:

private MenuItem menuItem;

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.menu_catalog, menu);

    menuItem = menu.findItem(R.id.action_badge);
    writeBadge(0);

    super.onCreateOptionsMenu(menu, inflater);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();
    if (id == R.id.action_badge) {
        // Your code.
        return true;
    }
    return super.onOptionsItemSelected(item);
}

private void writeBadge(int count) {
    MenuItemCompat.setActionView(menuItem, R.layout.item_badge);
    RelativeLayout layout = (RelativeLayout) MenuItemCompat.getActionView(menuItem);
    // A TextView with number.
    TextView tv = (TextView) layout.findViewById(R.id.badge);
    if (count == 0) {
        tv.setVisibility(View.INVISIBLE);
    } else {
        tv.setVisibility(View.VISIBLE);
        tv.setText(String.valueOf(count));
    }
    // An icon, it also must be clicked.
    ImageView imageView = (ImageView) layout.findViewById(R.id.image);
    View.OnClickListener onClickListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            onOptionsItemSelected(menuItem);
        }
    };
    menuItem.getActionView().setOnClickListener(onClickListener);
    imageView.setOnClickListener(onClickListener);
}


来源:https://stackoverflow.com/questions/30691736/android-fragments-onoptionsitemselected-doesnt-get-called

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!