Как сменить иконку пункта меню при загрузке Activity и проверке массива?

154
13 декабря 2018, 02:30

Есть код для добавления позиции в массив:

 public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        TextView cntContent = findViewById(R.id.cntContent);
        switch (id) {
            case R.id.favoriteNone:
                Intent giveIntent = getIntent();
                contentUrl = giveIntent.getStringExtra("URL_KEY");
                contentTitle = giveIntent.getStringExtra("TITLE_KEY");
                contentDate = giveIntent.getStringExtra("DATE_KEY");
                contentCategory = giveIntent.getStringExtra("CATEGORY_KEY");
                for(NewsClass urls : Favorites.favoritNews) {
                    if (urls.getmUrl().contains(contentUrl)) {
                        item.setIcon(R.drawable.ic_action_favdark);
                        Toast.makeText(this, "Уже есть в избранном", Toast.LENGTH_SHORT).show();
                        return false;
                    }
                }
                Favorites.favoritNews.add(new NewsClass(
                        contentTitle,
                        contentDate,
                        contentUrl,
                        contentCategory
                        ));
                TinyDB tinyDB = new TinyDB(this);
                tinyDB.clear();
                Gson gsonCreate = new Gson();
                ArrayList<String> gsonString = new ArrayList<>();
                for(int i = 0; i < Favorites.favoritNews.size(); i++)
                    gsonString.add(gsonCreate.toJson(Favorites.favoritNews.get(i)));
                tinyDB.putListString("tinyFavoritNews",gsonString);
                Toast.makeText(this, "Добавлено в избранное", Toast.LENGTH_SHORT).show();
                item.setIcon(R.drawable.ic_action_favdark);
                Intent favorites = new Intent(NewsContent.this, Favorites.class);
                startActivity(favorites);
                break;
        }
        return true;
    }

В данном случае код item.setIcon(R.drawable.ic_action_favdark); работает как нужно, иконка меняется. Но когда я делаю проверку массива на совпадение и в случае оного пытаюсь сменить иконку, приложение крашится:

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_news_content);
        Intent giveIntent = getIntent();
        contentUrl = giveIntent.getStringExtra("URL_KEY");
        contentTitle = giveIntent.getStringExtra("TITLE_KEY");
        contentDate = giveIntent.getStringExtra("DATE_KEY");
        contentCategory = giveIntent.getStringExtra("CATEGORY_KEY");
        setContentView(R.layout.activity_news_content);
        MenuItem fav = findViewById(R.id.favoriteNone);
        for(NewsClass urls : Favorites.favoritNews) {
            if (urls.getmUrl().contains(contentUrl)) {
                fav.setIcon(R.drawable.ic_action_favdark);
                Toast.makeText(this, "Уже есть в избранном", Toast.LENGTH_SHORT).show();
            }
        }

И крашится именно на строке fav.setIcon(R.drawable.ic_action_favdark);, ссылаясь на java.lang.NullPointerException: Attempt to invoke virtual method 'void android.view.View.setBackgroundResource(int)' on a null object reference

Как мне сменить иконку после проверки массива на совпадение?

Answer 1

Можно иначе:

private MenuItem itemMenu;
@Override
protected void onCreate...
    ...
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main, menu);
    // Получаете ссылку на пункт меню
    itemMenu = menu.findItem(R.id.item_menu);
    return true;
}

И в нужном месте:

itemMenu.setIcon(R.drawable.ic_picture);
Answer 2

Разобрался. Инициализируем меню

private Menu menu;

Меняем onCreateOptionsMenu:

public boolean onCreateOptionsMenu(Menu menu) {
    this.menu = menu;
    getMenuInflater().inflate(R.menu.menu_social, menu);
    return true;
}

И пишем в onPostExecute:

protected void onPostExecute(String result) {
    MenuItem fav = menu.findItem(R.id.favoriteNone);
    for(NewsClass urls : Favorites.favoritNews) {
        if (urls.getmUrl().contains(contentUrl)) {
            fav.setIcon(getResources().getDrawable(R.drawable.ic_action_favdark));
        }
    }
READ ALSO
Получить путь директории Tomcat

Получить путь директории Tomcat

подскажите пожалуйста, может кто знаетМожно ли как-то в java получить корневой путь Томката?

131
Обработчик ошибок для части кода

Обработчик ошибок для части кода

Код, который должен быть в обработчике ошибок:

146
&ldquo;TIFF file is missing a required tag StripOffsets&rdquo; - ошибка при работе с классом GeotiffReader

“TIFF file is missing a required tag StripOffsets” - ошибка при работе с классом GeotiffReader

Всем привет! Возникла такая проблема - при работе с некоторымиtiff при попытке получить DataRaster[] с использованием метода readDataRaster() (класс GeotiffReader...

156
Как протестировать ViewModel

Как протестировать ViewModel

Есть такой класс:

126