java - 如何在适配器类的菜单中找到图标的ViewById

标签 java android

我刚刚创建了这样的菜单作为底部栏

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/bb_menu_recents"
        android:icon="@drawable/floor"
        android:title="Floor 1" />
    <item
        android:id="@+id/floorNumber"
        android:icon="@drawable/floor"
        android:title="Floor 2" />
    <item
        android:id="@+id/bb_menu_nearby"
        android:icon="@drawable/floor"
        android:title="Others" />
</menu>

还创建了一个 getter 和 setter 类,我还创建了一个带有支架的适配器,这是我的适配器类

package abtech.waiteriano.com.waitrer.adapters;

import android.app.Activity;
import android.content.Context;
import android.support.annotation.NonNull;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.ArrayList;

import abtech.waiteriano.com.waitrer.R;
import abtech.waiteriano.com.waitrer.getters_and_setters.BottomBarItem;

/**
 * Created by dell on 2/27/2017.
 */

public class CustomBottomBarAdapter extends ArrayAdapter<BottomBarItem> {
    Context context;
    int layoutResourceId;
    ArrayList<BottomBarItem> data = new ArrayList<BottomBarItem>();

    public CustomBottomBarAdapter(Context context, int layoutResourceId, ArrayList<BottomBarItem>data) {
        super(context, layoutResourceId,data);
        this.layoutResourceId = layoutResourceId;
        this.context = context;
        this.data = data;
    }

        @NonNull
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View row = convertView;
            floorRecordHolder floorHolder = null;

            if (row == null){
                LayoutInflater inflater = ((Activity) context).getLayoutInflater();
                row = inflater.inflate(layoutResourceId, parent, false);

                floorHolder = new floorRecordHolder();
                floorHolder.floorNo = (TextView)row.findViewById(R.id.floorNumber);

            }else {
                floorHolder = (CustomBottomBarAdapter.floorRecordHolder) row.getTag();
            }
            BottomBarItem bottomBarItem = data.get(position);
            floorHolder.floorNo.setText(bottomBarItem.getFloorNo());
            return row;
        }

        static class floorRecordHolder{
            TextView floorNo;
            ImageView floorImage;
        }
    }

这是 Activity 代码

我只想在菜单中设置图标,就像我在菜单中设置文本一样

package abtech.waiteriano.com.waitrer;

import android.os.Bundle;
import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;

import com.roughike.bottombar.BottomBar;

import java.util.ArrayList;
import java.util.List;

import abtech.waiteriano.com.waitrer.adapters.CustomBottomBarAdapter;
import abtech.waiteriano.com.waitrer.fragments.TablesFragment;
import abtech.waiteriano.com.waitrer.getters_and_setters.BottomBarItem;

public class TabsActivity extends AppCompatActivity {

    private Toolbar toolbar;
    private TabLayout tabLayout;
    private ViewPager viewPager;
    private BottomBar mBottomBar;
    CustomBottomBarAdapter customBottomBarAdapter;
    ArrayList<BottomBarItem> bottomBarArray = new ArrayList<BottomBarItem>();


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_tabs);
        toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);


        mBottomBar = BottomBar.attach(this, savedInstanceState);
        mBottomBar.setItems(R.menu.bottombar_menu);
        customBottomBarAdapter = new CustomBottomBarAdapter(this,R.menu.bottombar_menu,bottomBarArray);


        viewPager = (ViewPager) findViewById(R.id.viewpager);

        /**
         * Initializing the viewpager with fragments
         */
        ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());


        adapter.addFragment(new TablesFragment(), "Progress");
        adapter.addFragment(MyFragment.newInstance("Example1"), "Example1");
        adapter.addFragment(MyFragment.newInstance("Example2"), "Example2");
        adapter.addFragment(MyFragment.newInstance("Example3"), "Example3");

        viewPager.setAdapter(adapter);

        tabLayout = (TabLayout) findViewById(R.id.tabs);

        //adding viewpager to the tablayout
        tabLayout.setupWithViewPager(viewPager);
        tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
    }
    class ViewPagerAdapter extends FragmentPagerAdapter {
        private final List<Fragment> mFragmentList = new ArrayList<>();
        private final List<String> mFragmentTitleList = new ArrayList<>();

        public ViewPagerAdapter(FragmentManager manager) {
            super(manager);
        }

        @Override
        public Fragment getItem(int position) {
            return mFragmentList.get(position);
        }

        @Override
        public int getCount() {
            return mFragmentList.size();
        }

        public void addFragment(Fragment fragment, String title) {
            mFragmentList.add(fragment);
            mFragmentTitleList.add(title);
        }

        @Override
        public CharSequence getPageTitle(int position) {
            return mFragmentTitleList.get(position);
        }
    }
}

    floorHolder.floorNo = (TextView)row.findViewById(R.id.floorNumber);

但是对于一个不适用于 textview 的图标,如果有任何不清楚的地方,请通知我,抱歉英语不好

最佳答案

I just want to set icon in the menu like I set text

你到底在哪里设置文本?此适配器未被使用...

customBottomBarAdapter = new CustomBottomBarAdapter(this,R.menu.bottombar_menu,bottomBarArray);

你实际上是用这个设置文本......

mBottomBar.setItems(R.menu.bottombar_menu);

基本上,R.menu 资源不会加载到 ArrayAdapter 中,通常只有 R.layout 值会加载。


在你的 Activity 中,你会需要这样的东西

mBottomBar = BottomBar.attach(this, savedInstanceState);
mBottomBar.setItems(R.menu.bottombar_menu);
BottomBarTab tab = mBottomBar.getTabWithId(R.id.floorNumber);
mBottomBar.setIconResId(R.drawable.new_img); // This method doesn't work, though

正如我所说,那是行不通的,因为该方法不是公开的(实际上根本不更新图标)。

它有一个 Unresolved 问题。

https://github.com/roughike/BottomBar/issues/659


总的来说,你似乎有一个用于“水平” View 的 TabLayout,所以我会用它来代替它 BottomBar .

您实际上可以非常轻松地设置TabLayout 的图标。

或使用实际的 Android 支持 BottomNavigationView ,同样可以更改图标。

关于java - 如何在适配器类的菜单中找到图标的ViewById,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42487867/

相关文章:

android - 如何仅在 Galaxy S3 上运行应用程序?

Android使用Local Service的目的是什么

java - 从表面 View 读取字节数组?

java - <p :fileUpload> always give me null contents

java - JSTL URL 标签在 Heroku 上不起作用

java - 专注于excel中的第一个单元格

android - 如何使用 Robolectric 隐藏 PackageManager

Android:从我的闹钟中减去分钟数

java - setMaxDate() 在 Lollipop 5.0.1 android 上无法完美运行,需要适当的解决方案

java - 是什么导致了 java.lang.ArrayIndexOutOfBoundsException 以及如何防止它?