Как реализовать добавление и удаление к избранной кнопке в android с помощью пункта меню - PullRequest
0 голосов
/ 23 апреля 2020

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

        @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        this.myMenu = menu;
        getMenuInflater().inflate(R.menu.menu_favorite, myMenu);
        favItem = myMenu.findItem(R.id.action_favorite);
        //set different icon when isFavorite is true.
        if (isFavorite){
            favItem.setIcon(R.drawable.ic_favorite_dark);
            Log.d(TAG, "onCreateOptionsMenu: favoriteItemIcon is checked");
        }
//        menu.getItem(R.id.action_favorite);
        return true;
    }
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        switch (item.getItemId()){
            case R.id.action_favorite:
            updateFavoriteStatus();
                break;
            case  android.R.id.home:
                finish();
                break;
        }
        return super.onOptionsItemSelected(item);
    }
    public void updateFavoriteStatus(){
        if (isFavorite){
            Toast.makeText(this,
                    " "your favorite is set ",
                    Toast.LENGTH_LONG).show();
        }
        else{
            mTeaDetailViewModel.setFavorite(false);
            Toast.makeText(this,
                    " Favourite is Removed",
                    Toast.LENGTH_LONG).show();
            favItem.setIcon(R.drawable.ic_favorite_border);

        }
    }

Вот мой класс Дао

@WorkerThread
@Query("UPDATE my_table SET favorite =:favValue  WHERE name = :name")
void updateFavorite(String name, boolean favValue);

Я хочу, чтобы при каждом щелчке по пункту меню значение для строки isFavorite обновлялось до значения true или false. В настоящее время работает то, что я могу обновить строку isFavorite только один раз, для которой установлено значение true. Я не могу сбросить его на false, когда я нажимаю на пункт меню во второй раз.

1 Ответ

0 голосов
/ 24 апреля 2020

Я наконец взломал его. Вот как я это сделал.

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        this.myMenu = menu;
        getMenuInflater().inflate(R.menu.menu_favorite, myMenu);
        favItem = myMenu.findItem(R.id.action_favorite);
        //set different icon when isFavorite is true.
        if (isFavorite){
            favItem.setIcon(R.drawable.ic_favorite_dark);
            Log.d(TAG, "onCreateOptionsMenu: favoriteItemIcon is checked");
        }
//        menu.getItem(R.id.action_favorite);
        return true;
    }
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        if(id==R.id.action_favorite){
            if (isFavorite){
                mTeaDetailViewModel.setFavorite(false);
                favItem.setIcon(R.drawable.ic_favorite_border);
                Toast.makeText(this,
                        " Favourite is Removed",
                        Toast.LENGTH_LONG).show();
            }
            else {
                mTeaDetailViewModel.setFavorite(true);
                favItem.setIcon(R.drawable.ic_favorite_dark);
                Toast.makeText(this,
                        "  favorite set successfully",
                        Toast.LENGTH_LONG).show();

            }
        }
        if (item.getItemId() == android.R.id.home) {
            finish();
        }
        return super.onOptionsItemSelected(item);
    }

Я заметил, что мне нужно сначала проверить, щелкает ли элемент, а затем, когда нажимается элемент, я проверяю статус isFavorite и обновляюсь соответствующим образом. Если при нажатии элемент уже является вашим любимым, то для него устанавливается значение false, и наоборот, благодаря этому я могу переключаться между истиной и ложью в любое время, когда я нажимаю на элемент. Надеюсь мой ответ кому-нибудь поможет.

...