android 底部菜单中图标的自定义布局

waxmsbnn  于 2023-06-27  发布在  Android
关注(0)|答案(1)|浏览(203)

我想实现一个自定义的图标之一,我在底部菜单的外观
我已经创建了button_custom. xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent">
  5. <ImageButton
  6. android:layout_width="40dp"
  7. android:layout_height="40dp"
  8. android:layout_gravity="center"
  9. android:background="@drawable/button_border"
  10. android:src="@drawable/ic_baseline_star_24"/>
  11. </FrameLayout>

我添加到我的菜单底部

  1. <item
  2. android:id="@+id/kuponimeni"
  3. android:title=""/>

我似乎不知道该在我的网站上添加什么V2MainFragment.java

  1. package com.uwv.apps.nadjinet1.fragments;
  2. import android.app.Activity;
  3. import android.content.Context;
  4. import android.content.Intent;
  5. import android.os.Bundle;
  6. import com.uwv.apps.nadjinet1.Services.BusStation;
  7. import com.uwv.apps.nadjinet1.activities.LoginV2Activity;
  8. import com.uwv.apps.nadjinet1.activities.ProfileActivity;
  9. import com.uwv.apps.nadjinet1.appconfig.AppConfig;
  10. import com.uwv.apps.nadjinet1.utils.NSLog;
  11. import android.view.LayoutInflater;
  12. import android.view.Menu;
  13. import android.view.MenuInflater;
  14. import android.view.MenuItem;
  15. import android.view.View;
  16. import android.view.ViewGroup;
  17. import android.widget.LinearLayout;
  18. import android.widget.TextView;
  19. import android.widget.Toast;
  20. import androidx.annotation.NonNull;
  21. import androidx.annotation.Nullable;
  22. import androidx.fragment.app.Fragment;
  23. import androidx.fragment.app.FragmentManager;
  24. import androidx.fragment.app.FragmentPagerAdapter;
  25. import androidx.fragment.app.FragmentTransaction;
  26. import com.uwv.apps.nadjinet1.R;
  27. import com.uwv.apps.nadjinet1.Services.NotifyDataNotificationEvent;
  28. import com.uwv.apps.nadjinet1.classes.Notification;
  29. import com.uwv.apps.nadjinet1.controllers.sessions.SessionsController;
  30. import com.uwv.apps.nadjinet1.customView.SwipeDisabledViewPager;
  31. import com.uwv.apps.nadjinet1.dtmessenger.MessengerHelper;
  32. import com.uwv.apps.nadjinet1.events.UnseenMessagesEvent;
  33. import com.google.android.gms.ads.AdListener;
  34. import com.google.android.gms.ads.AdRequest;
  35. import com.google.android.gms.ads.AdView;
  36. import com.google.android.gms.ads.LoadAdError;
  37. import com.google.android.gms.ads.interstitial.InterstitialAd;
  38. import com.google.android.gms.ads.interstitial.InterstitialAdLoadCallback;
  39. import com.google.android.material.bottomnavigation.BottomNavigationItemView;
  40. import com.google.android.material.bottomnavigation.BottomNavigationMenuView;
  41. import com.google.android.material.bottomnavigation.BottomNavigationView;
  42. import org.greenrobot.eventbus.EventBus;
  43. import org.greenrobot.eventbus.Subscribe;
  44. import org.greenrobot.eventbus.ThreadMode;
  45. import butterknife.BindView;
  46. import butterknife.ButterKnife;
  47. import static com.uwv.apps.nadjinet1.appconfig.AppConfig.APP_DEBUG;
  48. import static com.uwv.apps.nadjinet1.appconfig.AppConfig.SHOW_ADS;
  49. public class V2MainFragment extends Fragment {
  50. public final static String TAG = "mainfragment";
  51. static BottomNavigationView navigation;
  52. //navigation bottom
  53. @BindView(R.id.navigation_bottom)
  54. View navigation_bottom_view;
  55. //viewpager
  56. @BindView(R.id.viewpager)
  57. SwipeDisabledViewPager viewPager;
  58. //Admob
  59. @BindView(R.id.adsLayout)
  60. LinearLayout adsLayout;
  61. @BindView(R.id.adView)
  62. AdView mAdView;
  63. //context & main acityvity
  64. private Context myContext;
  65. //Menu
  66. private MenuItem prevMenuItem;
  67. //Declare listeners
  68. private Listener mListener;
  69. private ViewPagerAdapter adapter;
  70. @Override
  71. public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
  72. View rootView = inflater.inflate(R.layout.v3_fragment_main, container, false);
  73. ButterKnife.bind(this, rootView);
  74. //init view pager adapter
  75. initViewPagerAdapter();
  76. //Show Interstitial Ads
  77. initAmob();
  78. //init Navigation Bottom
  79. initNavigationBottomView();
  80. return rootView;
  81. }
  82. @Override
  83. public void onPause() {
  84. if (mAdView != null)
  85. mAdView.pause();
  86. super.onPause();
  87. }
  88. @Override
  89. public void onResume() {
  90. if (mAdView != null)
  91. mAdView.resume();
  92. super.onResume();
  93. }
  94. private InterstitialAd mInterstitialAd;
  95. private void initAmob() {
  96. //Show Banner Ads
  97. if (SHOW_ADS) {
  98. mAdView.setVisibility(View.VISIBLE);
  99. AdRequest adRequest = new AdRequest.Builder().build();
  100. mAdView.loadAd(adRequest);
  101. mAdView.setAdListener(new AdListener() {
  102. @Override
  103. public void onAdClicked() {
  104. // Code to be executed when the user clicks on an ad.
  105. }
  106. @Override
  107. public void onAdClosed() {
  108. // Code to be executed when the user is about to return
  109. // to the app after tapping on an ad.
  110. }
  111. @Override
  112. public void onAdFailedToLoad(LoadAdError adError) {
  113. // Code to be executed when an ad request fails.
  114. mAdView.setVisibility(View.GONE);
  115. }
  116. @Override
  117. public void onAdImpression() {
  118. // Code to be executed when an impression is recorded
  119. // for an ad.
  120. }
  121. @Override
  122. public void onAdLoaded() {
  123. super.onAdLoaded();
  124. mAdView.setVisibility(View.VISIBLE);
  125. }
  126. @Override
  127. public void onAdOpened() {
  128. // Code to be executed when an ad opens an overlay that
  129. // covers the screen.
  130. }
  131. });
  132. mAdView.loadAd(adRequest);
  133. }
  134. //show interstitial at first
  135. if(SHOW_ADS && AppConfig.SHOW_INTERSTITIAL_AT_FIRST){
  136. AdRequest adRequest = new AdRequest.Builder().build();
  137. InterstitialAd.load(getActivity(),getString(R.string.ad_interstitial_id), adRequest,
  138. new InterstitialAdLoadCallback() {
  139. @Override
  140. public void onAdLoaded(@NonNull InterstitialAd interstitialAd) {
  141. // The mInterstitialAd reference will be null until
  142. // an ad is loaded.
  143. mInterstitialAd = interstitialAd;
  144. mInterstitialAd.show(getActivity());
  145. NSLog.i(TAG, "onAdLoaded");
  146. }
  147. @Override
  148. public void onAdFailedToLoad(@NonNull LoadAdError loadAdError) {
  149. // Handle the error
  150. NSLog.d(TAG, loadAdError.toString());
  151. mInterstitialAd = null;
  152. }
  153. });
  154. }
  155. }
  156. @Override
  157. public void onDestroyView() {
  158. super.onDestroyView();
  159. if (mAdView != null)
  160. mAdView.destroy();
  161. }
  162. private void initViewPagerAdapter() {
  163. adapter = new ViewPagerAdapter(getFragmentManager());
  164. viewPager.setAdapter(adapter);
  165. viewPager.setOffscreenPageLimit(5);
  166. viewPager.setOnClickListener(new View.OnClickListener() {
  167. @Override
  168. public void onClick(View v) {
  169. NSLog.e("edd","dd");
  170. }
  171. });
  172. }
  173. public boolean setCurrentFragment(int position) {
  174. viewPager.setCurrentItem(position);
  175. navigation.getMenu().getItem(position).setChecked(true);
  176. return true;
  177. }
  178. public boolean ifFirstFragment() {
  179. return viewPager.getCurrentItem() == 0;
  180. }
  181. private void initNavigationBottomView() {
  182. if (mListener != null)
  183. mListener.onScrollHorizontal(0);
  184. navigation = navigation_bottom_view.findViewById(R.id.navigation);
  185. navigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
  186. @Override
  187. public boolean onNavigationItemSelected(@NonNull MenuItem item) {
  188. switch (item.getItemId()) {
  189. case R.id.navigation_home:
  190. viewPager.setCurrentItem(0);
  191. if (mListener != null)
  192. mListener.onScrollHorizontal(0);
  193. return true;
  194. case R.id.navigation_favorites:
  195. viewPager.setCurrentItem(1);
  196. if (mListener != null)
  197. mListener.onScrollHorizontal(1);
  198. return true;
  199. case R.id.navigation_notification:
  200. viewPager.setCurrentItem(2);
  201. if (mListener != null)
  202. mListener.onScrollHorizontal(2);
  203. return true;
  204. case R.id.kuponimeni:
  205. viewPager.setCurrentItem(3);
  206. if (mListener != null)
  207. mListener.onScrollHorizontal(3);
  208. return true;
  209. case R.id.navigation:
  210. BusStation.getBus().post(new NavigationDrawerFragment.NavigationDrawerEvent(1));
  211. }
  212. return false;
  213. }
  214. });
  215. }
  216. private void updateNotificationBadge() {
  217. //notificationsUnseen
  218. NotificationChatVPFragment.NotificationChaCount = Notification.notificationsUnseen + MessengerHelper.NbrMessagesManager.getNbrTotalMessages();
  219. BottomNavigationMenuView bottomNavigationMenuView =
  220. (BottomNavigationMenuView) navigation.getChildAt(0);
  221. View v = bottomNavigationMenuView.getChildAt(3);
  222. BottomNavigationItemView itemView = (BottomNavigationItemView) v;
  223. View badge = LayoutInflater.from(myContext)
  224. .inflate(R.layout.nav_btm_notif_badge, itemView, true);
  225. if (NotificationChatVPFragment.NotificationChaCount > 0) {
  226. badge.findViewById(R.id.notifications_badge).setVisibility(View.VISIBLE);
  227. int notificationCounter = NotificationChatVPFragment.NotificationChaCount;
  228. ((TextView) badge.findViewById(R.id.notifications_badge)).setText(notificationCounter >= 100 ? "+99" : String.valueOf(notificationCounter));
  229. } else {
  230. badge.findViewById(R.id.notifications_badge).setVisibility(View.GONE);
  231. }
  232. }
  233. // This method will be called when a Notification is posted (in the UI thread for Toast)
  234. @Subscribe(sticky = true, threadMode = ThreadMode.MAIN)
  235. public void onMessageEvent(NotifyDataNotificationEvent event) {
  236. if (event.message.equals("update_badges")) {
  237. updateNotificationBadge();
  238. }
  239. }
  240. // This method will be called when a Messages is posted (in the UI thread for Toast)
  241. @Subscribe(sticky = true, threadMode = ThreadMode.MAIN)
  242. public void onMessageEvent(UnseenMessagesEvent event) {
  243. if (APP_DEBUG)
  244. if (MessengerHelper.NbrMessagesManager.getNbrTotalMessages() > 0) {
  245. Toast.makeText(getActivity(), "New message " + MessengerHelper.NbrMessagesManager.getNbrTotalMessages()
  246. , Toast.LENGTH_LONG).show();
  247. }
  248. updateNotificationBadge();
  249. }
  250. private void pageChangedListener(final SwipeDisabledViewPager mViewPager, final BottomNavigationView mBottomNavigationView) {
  251. mViewPager.addOnPageChangeListener(new SwipeDisabledViewPager.OnPageChangeListener() {
  252. @Override
  253. public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
  254. }
  255. @Override
  256. public void onPageSelected(int position) {
  257. prevMenuItem = mBottomNavigationView.getMenu().getItem(position);
  258. if (prevMenuItem != null)
  259. prevMenuItem.setChecked(false);
  260. else {
  261. mBottomNavigationView.getMenu().getItem(0).setChecked(false);
  262. mBottomNavigationView.getMenu().getItem(position).setChecked(true);
  263. }
  264. }
  265. @Override
  266. public void onPageScrollStateChanged(int state) {
  267. }
  268. });
  269. }
  270. @Override
  271. public void onPrepareOptionsMenu(@NonNull Menu menu) {
  272. super.onPrepareOptionsMenu(menu);
  273. }
  274. @Override
  275. public void onActivityResult(int requestCode, int resultCode, Intent data) {
  276. super.onActivityResult(requestCode, resultCode, data);
  277. NSLog.e("dddd",viewPager.getCurrentItem());
  278. NSLog.e("dddd",adapter.getPageTitle(viewPager.getCurrentItem()).toString());
  279. NSLog.e("dddd",adapter.getPageTitle(viewPager.getCurrentItem()).toString());
  280. }
  281. @Override
  282. public void onAttach(Activity activity) {
  283. super.onAttach(activity);
  284. myContext = activity;
  285. }
  286. @Override
  287. public void onStart() {
  288. super.onStart();
  289. EventBus.getDefault().register(this);
  290. //display notification badge counter
  291. updateNotificationBadge();
  292. }
  293. @Override
  294. public void onStop() {
  295. super.onStop();
  296. EventBus.getDefault().unregister(this);
  297. }
  298. @Override
  299. public void onCreate(@Nullable Bundle savedInstanceState) {
  300. super.onCreate(savedInstanceState);
  301. setHasOptionsMenu(true);
  302. }
  303. @Override
  304. public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
  305. super.onCreateOptionsMenu(menu, inflater);
  306. inflater.inflate(R.menu.home_menu, menu);
  307. }
  308. @Override
  309. public boolean onOptionsItemSelected(MenuItem item) {
  310. if (item.getItemId() == android.R.id.home) {
  311. getActivity().finish();
  312. } else if (item.getItemId() == R.id.search_icon) {
  313. CustomSearchFragment fragment = new CustomSearchFragment();
  314. FragmentManager manager = getFragmentManager();
  315. manager.beginTransaction()
  316. .add(R.id.main_container, fragment)
  317. .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE)
  318. .addToBackStack("customSearchFrag")
  319. .commit();
  320. } else {
  321. Toast.makeText(myContext, item.getTitle(), Toast.LENGTH_SHORT).show();
  322. }
  323. return super.onOptionsItemSelected(item);
  324. }
  325. public void setListener(final Listener mItemListener) {
  326. this.mListener = mItemListener;
  327. }
  328. public interface Listener {
  329. void onScrollHorizontal(int position);
  330. void onScrollVertical(int scrollXs, int scrollY);
  331. }
  332. public class ViewPagerAdapter extends FragmentPagerAdapter implements HomeFragment.Listener {
  333. int FRAGS_ITEMS_NUM = 5;
  334. public ViewPagerAdapter(FragmentManager fragmentManager) {
  335. super(fragmentManager);
  336. }
  337. // Returns total number of pages
  338. @Override
  339. public int getCount() {
  340. return FRAGS_ITEMS_NUM;
  341. }
  342. // Returns the fragment to display for that page
  343. @Override
  344. public Fragment getItem(int position) {
  345. switch (position) {
  346. case 0:
  347. HomeFragment frag = HomeFragment.newInstance(0, "Page # 1");
  348. frag.setListener(this);
  349. return frag;
  350. case 1:
  351. return BookmarkFragment.newInstance(2, "Page # 2");
  352. case 2:
  353. return NotificationChatVPFragment.newInstance(3, "Page # 4");
  354. case 3:
  355. return YourFragment.newInstance(4, "Page # 3");
  356. case 4:
  357. if (SessionsController.isLogged())
  358. return ProfileFragment.newInstance(5, "Page # 5");
  359. else
  360. return AuthenticationFragment.newInstance(5, "Page # 5");
  361. default:
  362. return null;
  363. }
  364. }
  365. // Returns the page title for the top indicator
  366. @Override
  367. public CharSequence getPageTitle(int position) {
  368. return "Page " + position;
  369. }
  370. @Override
  371. public void onScroll(int scrollX, int scrollY) {
  372. NSLog.e("ViewPagerAdapter", scrollX + " - " + scrollY);
  373. if (mListener != null)
  374. mListener.onScrollVertical(scrollX, scrollY);
  375. }
  376. }
  377. }

我想请你帮忙
最终目标大致为enter image description here
我试过了

  1. MenuItem kuponimeniItem = navigation.getMenu().findItem(R.id.kuponimeni);
  2. View customView = LayoutInflater.from(requireContext()).inflate(R.layout.button_custom, null, false);
  3. FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
  4. layoutParams.gravity = Gravity.CENTER;
  5. customView.setLayoutParams(layoutParams);
  6. kuponimeniItem.setActionView(customView);

但我得到的只是空白,所以其他图标显示正常。button_custom应该在的地方是空的

bnlyeluc

bnlyeluc1#

无需为自定义按钮创建新的布局文件,只需将其嵌入到片段的布局文件中即可
一种方法是这样的

  1. <com.google.android.material.bottomnavigation.BottomNavigationView
  2. android:id="@+id/bottomNavigationView"
  3. android:layout_width="match_parent"
  4. android:layout_height="wrap_content"
  5. app:itemIconTint="@color/bnv_tab_item_foreground"
  6. app:itemTextColor="@color/bnv_tab_item_foreground"
  7. android:background="@color/colorFooter"
  8. app:layout_constraintBottom_toBottomOf="parent"
  9. app:menu="@menu/bottom_navigation_menu"
  10. tools:ignore="MissingConstraints" >
  11. <com.google.android.material.button.MaterialButton
  12. android:id="@+id/btnAdc"
  13. android:layout_width="76dp"
  14. android:layout_height="wrap_content"
  15. android:layout_gravity="center"
  16. android:background="@menu/buttonadd"
  17. android:gravity="center"
  18. android:text="@string/add_btn"
  19. android:textSize="25sp"
  20. />
  21. </com.google.android.material.bottomnavigation.BottomNavigationView>

您也可以使用约束来执行此操作。

  1. <ImageView
  2. android:id="@+id/imageView"
  3. android:layout_width="60dp"
  4. android:layout_height="60dp"
  5. android:elevation="2dp"
  6. android:src="@drawable/ic_usernew"
  7. app:layout_constraintBottom_toBottomOf="@+id/bot_nav_view"
  8. app:layout_constraintEnd_toEndOf="parent"
  9. app:layout_constraintStart_toStartOf="parent" />
  10. <com.google.android.material.bottomnavigation.BottomNavigationView
  11. android:id="@+id/bot_nav_view"
  12. android:layout_width="0dp"
  13. android:layout_height="wrap_content"
  14. android:layout_marginStart="0dp"
  15. android:layout_marginEnd="0dp"
  16. android:background="@color/white"
  17. app:elevation="0dp"
  18. app:itemIconSize="20dp"
  19. app:itemTextAppearanceActive="@style/BottomNavigationView.Active"
  20. app:itemTextAppearanceInactive="@style/BottomNavigationView"
  21. app:itemTextColor="@drawable/tab_icon_selector"
  22. app:labelVisibilityMode="labeled"
  23. app:layout_constraintBottom_toBottomOf="parent"
  24. app:layout_constraintLeft_toLeftOf="parent"
  25. app:layout_constraintRight_toRightOf="parent"
  26. app:menu="@menu/bottom_nav_menu" />
  27. </androidx.constraintlayout.widget.ConstraintLayout>

此组件将占用您在菜单项列表中指定的空白空间。

展开查看全部

相关问题