详解Xamarin.Android 利用Fragment实现底部菜单

本篇文章主要介绍了详解Xamarin.Android 利用Fragment实现底部菜单,分享给大家,具体如下:

效果图:

第一步:添加引用

引用 Crosslight.Xamarin.Android.Support.v7.AppCompat 这个包。

第二步:绘制Main和Fragment界面

fg_home.axml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:background="#FFFFFF">
  <TextView
    android:id="@+id/txt_content"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:text="首页"
    android:textColor="#000000"
    android:textSize="20sp" />
</LinearLayout>

fg_label.axml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:background="#FFFFFF">
  <TextView
    android:id="@+id/txt_content"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:text="贴签"
    android:textColor="#000000"
    android:textSize="20sp" />
</LinearLayout>

fg_mine.axml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:background="#FFFFFF">
  <TextView
    android:id="@+id/txt_content"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:text="我的"
    android:textColor="#000000"
    android:textSize="20sp" />
</LinearLayout>

fg_query.axml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:background="#FFFFFF">
  <TextView
    android:id="@+id/txt_content"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:text="查询"
    android:textColor="#000000"
    android:textSize="20sp" />
</LinearLayout>

Main.axml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical">
  <include
    layout="@layout/main_left" />
</LinearLayout>

main_left.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/dl_left"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:background="#f0f0f0">
 <!--主布局-->
 <LinearLayout
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:orientation="horizontal">
  <RelativeLayout
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:id="@+id/relativelayout1"
   android:fitsSystemWindows="true">
   <RelativeLayout
     android:id="@+id/ly_top_bar"
     android:layout_width="match_parent"
     android:layout_height="48dp"
     android:visibility="gone">
   </RelativeLayout>
   <LinearLayout
      android:id="@+id/ly_tab_bar"
      android:layout_width="match_parent"
      android:layout_height="50dp"
      android:layout_alignParentBottom="true"
      android:background="#FFFFFF"
       android:orientation="vertical">

    <View
      android:layout_width="match_parent"
      android:layout_height="2px"
      android:background="#cccccc" />
    <LinearLayout
      android:layout_width="match_parent"
      android:layout_height="40dp"
      android:orientation="horizontal"
      android:layout_marginTop="5dp">
     <ImageView
      android:id="@+id/iv_home"
      android:layout_width="25.6dp"
      android:layout_height="37.6dp"
      android:src="@drawable/icon_home1"
      android:layout_weight="1"/>
     <ImageView
      android:id="@+id/iv_query"
      android:layout_width="25.6dp"
      android:layout_height="37.6dp"
      android:src="@drawable/icon_query1"
      android:layout_weight="1"/>
     <ImageView
      android:id="@+id/iv_label"
     android:layout_width="25.6dp"
      android:layout_height="37.6dp"
      android:src="@drawable/icon_label1"
      android:layout_weight="1"/>
     <ImageView
      android:id="@+id/iv_mine"
      android:layout_width="25.6dp"
      android:layout_height="37.6dp"
      android:src="@drawable/icon_mine1"
      android:layout_weight="1"/>
    </LinearLayout>
   </LinearLayout>
   <View
     android:id="@+id/div_tab_bar"
     android:layout_width="match_parent"
     android:layout_height="2px"
     android:background="#FFFFFF"
     android:layout_above="@id/ly_tab_bar" />
   <FrameLayout
     android:layout_width="match_parent"
     android:layout_height="match_parent"
      android:id="@+id/fy_home"
     android:layout_below="@id/ly_top_bar"
     android:layout_above="@id/div_tab_bar" />
   <FrameLayout
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:id="@+id/fy_query"
      android:layout_below="@id/ly_top_bar"
     android:layout_above="@id/div_tab_bar"/>
   <FrameLayout
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:id="@+id/fy_label"
      android:layout_below="@id/ly_top_bar"
     android:layout_above="@id/div_tab_bar"/>
   <FrameLayout
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:id="@+id/fy_mine"
      android:layout_below="@id/ly_top_bar"
     android:layout_above="@id/div_tab_bar"/>
  </RelativeLayout>
 </LinearLayout>
</android.support.v4.widget.DrawerLayout>

第三步:在value文件下创建Style,并且自定义 BaseAppTheme 样式

<?xml version="1.0" encoding="utf-8" ?>
<resources> 

 <color name="primary">#1e89e7</color>
 <color name="primaryDark">#1976d2</color>
 <color name="red">#ff0000</color>
 <color name="white">#ffffff</color>

 <style name="BaseAppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
  <item name="windowActionBar">false</item>
  <item name="windowNoTitle">true</item>
  <item name="colorPrimary">@color/primary</item>
  <item name="colorPrimaryDark">@color/primaryDark</item>
  <item name="drawerArrowStyle">@style/AppTheme.DrawerArrowToggle</item>
 </style>

 <style name="AppTheme.DrawerArrowToggle" parent="Base.Widget.AppCompat.DrawerArrowToggle">
  <item name="color">@android:color/white</item>
 </style>
</resources>

第四步:编写每个Fragment的后台,这里只写一个。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Util;
using Android.Views;
using Android.Widget;

namespace BottomMuneDemo.Fragments
{
  public class HomeFragment : Fragment
  {
    private string content { get; set; }
    public HomeFragment(string content)
    {
      this.content = content;
    }

    public override void OnCreate(Bundle savedInstanceState)
    {
      base.OnCreate(savedInstanceState);

      // Create your fragment here
    }

    public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
      View view = inflater.Inflate(Resource.Layout.fg_home, container, false);
      TextView txt_content = (TextView)view.FindViewById(Resource.Id.txt_content);
      txt_content.Text = "首页";

      return view;
    }
  }
}

第五步:在Main活动中进行设置。

using Android.App;
using Android.Widget;
using Android.OS;
using Android.Support.V7.App;
using BottomMuneDemo.Fragments;
using Android.Views;

namespace BottomMuneDemo
{
  [Activity(Label = "BottomMuneDemo", MainLauncher = true, Theme = "@style/BaseAppTheme")]
  public class MainActivity : AppCompatActivity
  {
    private ImageView iv_home;
    private ImageView iv_query;
    private ImageView iv_label;
    private ImageView iv_mine;

    private FrameLayout fy_home;
    private FrameLayout fy_query;
    private FrameLayout fy_label;
    private FrameLayout fy_mine;

    HomeFragment fg1;
    QueryFragment fg2;
    LabelFragment fg3;
    MineFragment fg4;

    protected override void OnCreate(Bundle savedInstanceState)
    {
      base.OnCreate(savedInstanceState);
      SetContentView(Resource.Layout.Main);

      fy_home = (FrameLayout)FindViewById(Resource.Id.fy_home);
      fy_query = (FrameLayout)FindViewById(Resource.Id.fy_query);
      fy_label = (FrameLayout)FindViewById(Resource.Id.fy_label);
      fy_mine = (FrameLayout)FindViewById(Resource.Id.fy_mine);

      iv_home = (ImageView)FindViewById(Resource.Id.iv_home);
      iv_query = (ImageView)FindViewById(Resource.Id.iv_query);
      iv_label = (ImageView)FindViewById(Resource.Id.iv_label);
      iv_mine = (ImageView)FindViewById(Resource.Id.iv_mine);

      bindViews();
      iv_home.PerformClick();

    }

    #region 底部菜单选项卡 

    //ui组件初始化与事件绑定
    private void bindViews()
    {

      iv_home.Click += (s, e) => { onClick(iv_home); };
      iv_query.Click += delegate { onClick(iv_query); };
      iv_label.Click += delegate { onClick(iv_label); };
      iv_mine.Click += delegate { onClick(iv_mine); };
    }
    //隐藏所有Fragment
    private void hideAllFragment(FragmentTransaction fragmentTransaction)
    {
      if (fg1 != null) fragmentTransaction.Hide(fg1);
      if (fg2 != null) fragmentTransaction.Hide(fg2);
      if (fg3 != null) fragmentTransaction.Hide(fg3);
      if (fg4 != null) fragmentTransaction.Hide(fg4);

      iv_home.SetImageResource(Resource.Drawable.icon_home1);
      iv_query.SetImageResource(Resource.Drawable.icon_query1);
      iv_label.SetImageResource(Resource.Drawable.icon_label1);
      iv_mine.SetImageResource(Resource.Drawable.icon_mine1);
    }
    //重置所有文本的选中状态
    private void setSelected()
    {
      iv_home.Selected = false;
      iv_query.Selected = false;
      iv_label.Selected = false;
      iv_mine.Selected = false;
    }
    //单击事件
    public void onClick(View v)
    {
      FragmentTransaction fTransaction = FragmentManager.BeginTransaction();
      hideAllFragment(fTransaction);
      switch (v.Id)
      {
        case Resource.Id.iv_home:
          setSelected();
          iv_home.Selected = true;
          iv_home.SetImageResource(Resource.Drawable.icon_home2);
          if (fg1 == null)
          {
            fg1 = new HomeFragment("首页");
            fTransaction.Add(Resource.Id.fy_home, fg1);
          }
          else { fTransaction.Show(fg1); }
          break;

        case Resource.Id.iv_query:
          setSelected();
          iv_query.Selected = true;
          iv_query.SetImageResource(Resource.Drawable.icon_query2);
          if (fg2 == null)
          {
            fg2 = new QueryFragment("查询");
            fTransaction.Add(Resource.Id.fy_query, fg2);
          }
          else { fTransaction.Show(fg2); }
          break;

        case Resource.Id.iv_label:
          setSelected();
          iv_label.Selected = true;
          iv_label.SetImageResource(Resource.Drawable.icon_label2);
          if (fg3 == null)
          {
            fg3 = new LabelFragment("贴签");
            fTransaction.Add(Resource.Id.fy_label, fg3);
          }
          else { fTransaction.Show(fg3); }
          break;

        case Resource.Id.iv_mine:
          setSelected();
          iv_mine.Selected = true;
          iv_mine.SetImageResource(Resource.Drawable.icon_mine2);
          if (fg4 == null)
          {
            fg4 = new MineFragment("我的");
            fTransaction.Add(Resource.Id.fy_mine, fg4);
          }
          else { fTransaction.Show(fg4); }
          break;
      }
      fTransaction.Commit();
    }
    #endregion
  }
}

到这里就结束了,亲测代码有效,如有问题请留言。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android仿微信顶/底部菜单栏效果

    本文要实现仿微信微信底部菜单栏+顶部菜单栏,采用ViewPage来做,每一个page对应一个XML,当手指在ViewPage左右滑动时,就相应显示不同的page(其实就是xml)并且同时改变底部菜单按钮的图片变暗或变亮,同时如果点击底部菜单按钮,左右滑动page(其实就是xml)并且改变相应按钮的亮度. 一.布局 1.顶部菜单布局,命名为top_layout.xml <?xml version="1.0" encoding="utf-8"?> <R

  • Android使用开源组件PagerBottomTabStrip实现底部菜单和顶部导航功能

    PagerBottomTabStrip 是一个基本按谷歌Material Design规范完成的安卓底部导航栏控件 官方设计规范:https://www.google.com/design/spec/components/bottom-navigation.html 1.前言 (1)底部选择菜单功能应该是大多app都会用到的,实现方式也有很多种,比较笨的方法可以自定义一个xml,下方布局样式,每次点击不同按钮时跳转到不同activity,这个activity重新加载一下底部菜单 (2)今天介绍一

  • Android 使用FragmentTabHost实现底部菜单功能

    前言 现在大部分App底部都有一个菜单,实现这个功能也有好多办法: - TabHost+Fragment - RadioGroup+Fragment - FragmentTabHost+Fragment - 5.0以后有个新控件,BottomNavigator 这篇主要介绍下FragmentTabHost配合Fragment使用 运行效果图 效果图分析 FragmentTabHost简单介绍 首先我们看下官方文档的介绍 OK,接着官方还给出了一份使用的代码,我们也来看下 Activity中使用

  • android实现上滑屏幕隐藏底部菜单栏的示例

    本篇文章引用github上一个仿今日头条项目,项目地址: https://github.com/iMeiji/Toutiao ,主要实现的功能是底部菜单栏随用户手势滑动而变化可见状态 布局代码 这个功能实现起来比较简单,主要利用了CoordinatorLayout的 layout_behavior 的属性.具体代码如下: <android.support.design.widget.CoordinatorLayout android:layout_width="match_parent&q

  • Android底部菜单简单应用

    在Android中实现菜单功能有多种方法. Options Menu:用户按下menu Button时显示的菜单. Context Menu:用户长时间按下屏幕,所显示出来的菜单也称为上下文菜单. Submenu:子菜单. 但是有时候这些内置的菜单并不能满足我们功能,这就需要自己自定义一种菜单.接下来我说的这种就是通过TabHost与RadioGroup结合完成的菜单.这也是很常用的一种底部菜单做法.先上图: Xml代码 <?xml version="1.0" encoding=

  • android底部菜单栏实现原理与代码

    上一个项目已经做完了,这周基本上没事,所以整理了下以前的项目,想把一些通用的部分封装起来,这样以后遇到相似的项目就不用重复发明轮子了,也节省了开发效率.今天把demo贴出来一是方便以后自己查询,二是希望同时也能帮到大家. 底部菜单栏很重要,我看了一下很多应用软件都是用了底部菜单栏做.我这里使用了tabhost做了一种通用的(就是可以像微信那样显示未读消息数量的,虽然之前也做过但是layout下的xml写的太臃肿,这里去掉了很多不必要的层,个人看起来还是不错的,所以贴出来方便以后使用). 先看一下

  • Android仿微信底部菜单栏效果

    前言 在市面上,大多数的APP都需要通过底部菜单栏来将程序的功能进行分类整理,通常都是分为3-5个大模块,从而正确有效地引导用户去使用我们的APP.实现底部菜单栏的方法也有很多种. 1.仿微信底部菜单栏(ViewPager+ImagerView+TextView) ......(其他方式后续会补充) 效果预览 首先来个开胃菜,看看实现效果: 先贴出项目所需的资源文件,这些可随个人自由更改颜色和文字 colors.xml <color name="bg_line_light_gray&quo

  • Android中底部菜单被输入法顶上去的解决方案

    安卓手机输入法弹出,消失会触发 window.onresize事件,我们一般的解决方法是获取焦点,底部隐藏,失去焦点,底部菜单出现,但是,有些人会点击这个按钮收起键牌 那么,这个时候你的失去焦点无效,还有一种方法呢,是把position:fixed;改成position:absoult;这样底部菜单就不会顶上去,但是这种方法,经过我的实验,还是会被输入法顶上去,这两种方法都不要完全解决问题,还有一种是布局的问题,主页面:position:relative,底部菜单:position:absoul

  • Android底部菜单栏实现的实例代码

     Android 使用RadioGroup 实现底部导航菜单栏. 一.主界面布局的实现: 先来张效果图: 介绍一下总体界面包括的内容:底部五个导航按钮,主界面包括一个FrameLayout用来放五个Fragment.点击底部按钮会对应跳转到指定的界面. 实现布局:activity_main.xml <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="h

  • 详解Xamarin.Android 利用Fragment实现底部菜单

    本篇文章主要介绍了详解Xamarin.Android 利用Fragment实现底部菜单,分享给大家,具体如下: 效果图: 第一步:添加引用 引用 Crosslight.Xamarin.Android.Support.v7.AppCompat 这个包. 第二步:绘制Main和Fragment界面 fg_home.axml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:androi

  • 详解xamarin Android 实现ListView万能适配器

    详解xamarin Android 实现ListView万能适配器 早些时候接触xamarin Android 的列表,写了很多ListView的Adapter,建一个ListView就写一个Adapter,每一个Adapter里面还有去写一个ViewHolder的类来优化,自从看了hongyang博客的listview万能适配器的文章,学习良多,所以就写篇关于xamarin android ListView通用适配器的文章. 本章主要分为以下三点: 打造通用的ViewHolder优化ListV

  • 详解Kotlin Android开发中的环境配置

    详解Kotlin Android开发中的环境配置 在Android Studio上面进行安装插件 在Settings ->Plugins ->Browse repositores.. ->kotlin 安装完成后重启Android Studio就生效了 如图所示: 在Android Studio中做Kotlin相关配置 (1)在根目录 的build.gradle中进行配置使用,代码如下: buildscript { ext.kotlin_version = '1.1.2-4' repos

  • 详解linux下利用crontab创建定时任务

    Linux下可以利用crontab创建定时任务. 常用搭配 crontab -e 编辑任务 crontab -l 查看所有任务[该用户] crontab -r 取消所有任务[该用户] 任务格式 × × × × × +命令(具体任务) 前5个参数表示时间,依次为: 参数 范围 分钟 0-59 小时 0-23 日期 1-31 月份 1-12 星期 0-6(0代表星期日) 特殊符号 为了精确表示定时,需要一些特殊符号来描述具体的任务执行时间.有以下几个符号: "/" 代表每,每隔多长时间 &

  • 详解基于Android的Appium+Python自动化脚本编写

    1.Appium Appium是一个开源测试自动化框架,可用于原生,混合和移动Web应用程序测试, 它使用WebDriver协议驱动iOS,Android和Windows应用程序. 通过Appium,我们可以模拟点击和屏幕的滑动,可以获取元素的id和classname,还可以根据操作生成相关的脚本代码. 下面开始Appium的配置. appPackage和APPActivity的获取 任意下载一个app 解压 但是解压出来的xml文件可能是乱码,所以我们需要反编译文件. 逆向AndroidMan

  • 详解pandas中利用DataFrame对象的.loc[]、.iloc[]方法抽取数据

    pandas的DataFrame对象,本质上是二维矩阵,跟常规二维矩阵的差别在于前者额外指定了每一行和每一列的名称.这样内部数据抽取既可以用"行列名称(对应.loc[]方法)",也可以用"矩阵下标(对应.iloc[]方法)"两种方式进行. 下面具体说明: (以下程序均在Jupyter notebook中进行,部分语句的print()函数省略) 首先生成一个DataFrame对象: import pandas as pd score = [[34,67,87],[68

  • 详解Python如何利用turtle绘制中国结

    目录 导语 一.中国结 01  平安喜乐 1)效果图 2)附代码 二.中国结 02 心想事成 1)效果图 2)附代码 三.中国结 03 烟火年年 总结 导语 春节是中国特有的传统节日,中国结是中华民族特有的纯粹的文化精髓,富含丰富的文化底蕴,代表着我们对未来,对美好生活的向往和憧憬.新春佳节,小编祝福大家虎年吉祥!万事如意!祝我们的祖国引领世界,勇立潮头!国富民强! 渐渐的,渐渐的,新年很快就要到来.在快过新年时,人们有一个习俗,那就是买“中国结”. 据说,中国结可以让一家人平平安安.幸福,所以

  • 详解Python如何利用Pandas与NumPy进行数据清洗

    目录 准备工作 DataFrame 列的删除 DataFrame 索引更改 DataFrame 数据字段整理 str 方法与 NumPy 结合清理列 apply 函数清理整个数据集 DataFrame 跳过行 DataFrame 重命名列 许多数据科学家认为获取和清理数据的初始步骤占工作的 80%,花费大量时间来清理数据集并将它们归结为可以使用的形式. 因此如果你是刚刚踏入这个领域或计划踏入这个领域,重要的是能够处理杂乱的数据,无论数据是否包含缺失值.不一致的格式.格式错误的记录还是无意义的异常

  • 详解Python如何利用pymysql封装项目通用的连接和查询

    目录 前言 pymysql 介绍与安装 pymysql 的使用 封装项目通用的连接和查询 结语 前言 一个项目通常都需要有数据库,而对于python这门语言,除了一些框架自带orm或者扩展的orm(像django自带orm,flask则需要扩展的orm),使用orm必然有他的好处,但毫无疑问你要花时间学习这个orm,那么接下来阿牛带你们用pymysql简单分装一个通用的连接,关闭和查询! pymysql 介绍与安装 PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一

  • 详解Java如何利用位操作符创建位掩码

    目录 位掩码 举个例子 编码 解码 提取一个比特 第一比特 任意位置的位 提取多个比特 应用一个比特掩码 总结 在本文中,我们来看看如何使用位操作符实现低级别的位掩码.我们将看到我们如何将一个单一的int变量作为一个单独的数据容器. 位掩码 位掩码允许我们在一个数字变量中存储多个值.我们不再把这个变量看作一个整数,而是把它的每一个比特当作一个独立的值. 因为一个比特可以等于 0 或 1,我们也可以把它看成是 false 或 true .我们也可以把一组比特切开,把它们当作一个较小的数字变量甚至是

随机推荐