1.首先上效果图

2.本例实现的效果主要适用于当前页面有多个页签时。进行Fragment切换时,能够利用不同的Menu样式与当前Fragment中的内容进行配合,能够大大添加复用性,看到效果图后,以下我来介绍我实现这一效果的主要步骤

2.1  由于此处我有3个样式,那么我须要在res/menu 目录下创建三个文件,style1.xml,style2.xml,style3.xml.这里我以style1.xml为例。详细的文字图标文件可依照需求,style2.xml,style3.xml类似。

style1.xml 源代码例如以下:

<menu xmlns:android="http://schemas.android.com/apk/res/android" >

    <item
android:id="@+id/action_item1"
android:orderInCategory="100"
android:showAsAction="ifRoom|withText"
android:icon="@drawable/ic_menu_discard"
android:title="@string/style1"/> </menu>

2.2  在res/layout 文件下 分别创建activity 与fragment的相应视图文件,我拿Activity与当中一个Fragment举例,剩下的大家能够举一反三

activity_main.xml源代码

<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" > <android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center" >
</android.support.v4.view.ViewPager> </RelativeLayout>

fragment_first源代码

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" > <TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="第一个Fragment"
/> </RelativeLayout>

2.3 接下来就是逻辑实现了,依照效果我须要创建一个主逻辑Activity与三个Fragment逻辑文件,这里我相同仅仅拿一个Fragment举例。剩下两个类似

FirstFragment源代码:

package com.yqc.menuswitchdemo;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup; public class FirstFragment extends Fragment { @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_first, container,
false); return rootView;
} }

当中,在使用Fragment时须要一个自己定义适配器,源代码例如以下:

package com.yqc.menuswitchdemo;

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter; public class LFFragmentPagerAdapter extends FragmentPagerAdapter {
Fragment[] fragmentArray; public LFFragmentPagerAdapter(FragmentManager fm,Fragment[] fragmentArray2) {
super(fm);
// TODO Auto-generated constructor stub
if (null == fragmentArray2) {
this.fragmentArray = new Fragment[] {};
} else {
this.fragmentArray = fragmentArray2;
}
} @Override
public Fragment getItem(int arg0) {
// TODO Auto-generated method stub
return fragmentArray[arg0];
} @Override
public int getCount() {
// TODO Auto-generated method stub
return fragmentArray.length;
} }

最后,MainActivity源代码:

package com.yqc.menuswitchdemo;

import android.os.Bundle;
import android.app.ActionBar;
import android.app.ActionBar.Tab;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.Toast; /**
* @author YangQiCong 杨奇聪 QQ群 90733929 欢迎交流
*/
public class MainActivity extends FragmentActivity { private ViewPager viewPager;
private ActionBar actionBar; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
viewPager = (ViewPager) findViewById(R.id.viewpager);
Fragment fragment1 = new FirstFragment();
Fragment fragment2 = new SecondFragment();
Fragment fragment3 = new ThirdFragment();
Fragment[] fragmentArray = new Fragment[] { fragment1, fragment2,
fragment3 };
LFFragmentPagerAdapter adapter = new LFFragmentPagerAdapter(
getSupportFragmentManager(), fragmentArray); viewPager.setAdapter(adapter);
viewPager.setOffscreenPageLimit(3);
viewPager.setOnPageChangeListener(new OnPageChangeListener() { @Override
public void onPageSelected(int arg0) {
// TODO Auto-generated method stub
System.out.println("arg0:" + arg0);
actionBar.setSelectedNavigationItem(arg0);
} @Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
// TODO Auto-generated method stub } @Override
public void onPageScrollStateChanged(int arg0) {
// TODO Auto-generated method stub }
}); actionBar = getActionBar();
// 设置ActionBar 的导航方式: Tab导航
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); // actionBar.get Tab tab1 = actionBar.newTab().setText("页签1")
.setIcon(android.R.drawable.ic_menu_agenda)
.setTabListener(new ActionTabListener(fragment1)); Tab tab2 = actionBar.newTab().setText("页签2")
.setIcon(android.R.drawable.ic_menu_agenda)
.setTabListener(new ActionTabListener(fragment2)); Tab tab3 = actionBar.newTab().setText("页签3")
.setIcon(android.R.drawable.ic_menu_agenda)
.setTabListener(new ActionTabListener(fragment3)); actionBar.addTab(tab1);
actionBar.addTab(tab2);
actionBar.addTab(tab3); } class ActionTabListener implements ActionBar.TabListener { // 声明Fragment private Fragment fragment; // 通过构造引用相应的Fragment public ActionTabListener(Fragment fragment) {
this.fragment = fragment;
} @Override
public void onTabReselected(Tab tab, android.app.FragmentTransaction ft) {
// TODO Auto-generated method stub } @Override
public void onTabSelected(Tab tab, android.app.FragmentTransaction ft) {
// TODO Auto-generated method stub
// ft.add(android.R.id.content, fragment, null);
mType = tab.getPosition();
System.out.println("tab.getPosition():" + tab.getPosition());
viewPager.setCurrentItem(tab.getPosition());
invalidateOptionsMenu();
} @Override
public void onTabUnselected(Tab tab, android.app.FragmentTransaction ft) {
// TODO Auto-generated method stub } } @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.style1, menu);
return true;
} private int mType; @Override
public boolean onPrepareOptionsMenu(Menu menu) {
// TODO Auto-generated method stub System.out.println("当前mType:" + mType);
menu.clear();
MenuInflater inflater = this.getMenuInflater();
switch (mType) {
case 0:
inflater.inflate(R.menu.style1, menu);
break; case 1:
inflater.inflate(R.menu.style2, menu);
break; case 2:
inflater.inflate(R.menu.style3, menu);
break;
}
return super.onPrepareOptionsMenu(menu);
} @Override
public boolean onOptionsItemSelected(MenuItem item) {
// TODO Auto-generated method stub
switch (item.getItemId()) {
case R.id.action_item1:
Toast.makeText(this, "点击了第一个button", Toast.LENGTH_SHORT).show();
break;
case R.id.action_item2:
Toast.makeText(this, "点击了第二个button", Toast.LENGTH_SHORT).show();
break;
case R.id.action_item3:
Toast.makeText(this, "点击了第三个button", Toast.LENGTH_SHORT).show();
break;
} return super.onOptionsItemSelected(item);
} }

3. 须要注意的是MainActivity主逻辑中我的mType是一个标识量。用于标识当前Fragment然后切换。假设有疑问欢迎大家一起交流

本例的所有源码点击这里,转载请注明出处。谢谢!

Android编程心得-使用ActionBar+Fragment+ViewPager实现动态切换Menu效果的更多相关文章

  1. Android典型界面设计——FragmentTabHost+Fragment实现底部tab切换

    一.问题描述 在上次博文中,我们使用RadioGroup+ViewPage+Fragmen实现了顶部滑动导航(查看文章:http://www.cnblogs.com/jerehedu/p/460759 ...

  2. Android编程心得-在任意类中获取当前屏幕宽高

    进行Android编程时,很多时候都需要获取当前屏幕的宽度与高度,但是当我们需要在别的类中调用屏幕宽高时,直接用原来的方法是不行的,下面我来介绍如何在任意类中调用宽度高度的两种方法. public v ...

  3. Android --------------------ActionBar 与 ViewPager 和 ActionTab 切换 的源代码实现

    參考网址: 点击打开链接 源代码实现: package com.example.actionbardemo2; import android.app.ActionBar; import android ...

  4. Android编程心得-ListView的Item高亮显示的办法

    在我们使用ListView的时候,经常会遇到某一项(Item)需要高亮显示的情况,如下图,有人说当我们点击子项的时候会变亮,但有时候业务逻辑需要让ITEM根据条件自动变亮,下面我来介绍一下我自己的解决 ...

  5. 【转】[Android编程心得] Camera(OpenCV)自动对焦和触摸对焦的实现

    参考http://stackoverflow.com/questions/18460647/android-setfocusarea-and-auto-focus http://blog.csdn.n ...

  6. Android编程心得-JSON使用心得(二)

    在Android开发中,我们经常会用到JSON来与网络数据进行交互,下面我来介绍如何对JSON数据进行解析与制造 1.当我们需要对如下JSON串进行制造时: { "download" ...

  7. Android编程心得-设计一个可重用的自定义Dialog

            我们在实际开发过程中,会遇到一个问题,我们的Dialog如果使用一般的方法进行设置调用出来,会有很多的重复代码,如何将Dialog按照自己的思路设计呢,并让其可重用呢,下面我来介绍一下 ...

  8. Android编程心得-图片自适应心得

    在Android 的开发过程中,我们知道存放图片资源的文件夹是drawable,与它类似的名字的文件夹drawble-hdpi,drawable-ldpi,drawable-mdpi,drawable ...

  9. Android编程心得-Service数据绑定初步

    在Android里,Service的数据绑定是一种重要的用法,我们知道Service与Activity一样是运行在当前应用进程的主线程里面的,他们之间交互的方式有多种,下面我来介绍一下如何使用数据绑定 ...

随机推荐

  1. tortoisegit安装、clon、推送

    下载/tortoisegit软件,根据对应系统下载相对应的软件及其汉化包   下载地址:https://tortoisegit.org/download/ 先安装软件包,再安装语言包,可以自己设置路径 ...

  2. windows 安装tp5 composer方式

    1.下载windows composer-setup.exe(我已下载一个Composer-Setup.exe); 2.我电脑使用的是phpstudy2018版 php-7.0.12-NTS 3.然后 ...

  3. 嵌套循环连接(Nested Loops Joins)

    The nested loops join, also called nested iteration, uses one join input as the outer input table(sh ...

  4. Codeforces 1082 D. Maximum Diameter Graph-树的直径-最长链-构造题 (Educational Codeforces Round 55 (Rated for Div. 2))

    D. Maximum Diameter Graph time limit per test 2 seconds memory limit per test 256 megabytes input st ...

  5. What is Double Spending & How Does Bitcoin Handle It?

    https://coinsutra.com/bitcoin-double-spending/ Bitcoin is gaining rapid popularity and adoption acro ...

  6. [USACO 2018 Feb Gold] Tutorial

    Link: USACO 2018 Feb Gold 传送门 A: $dp[i][j][k]$表示前$i$个中有$j$个0且末位为$k$的最优解 状态数$O(n^3)$ #include <bit ...

  7. 2017icpc 乌鲁木齐网络赛

    A .Banana Bananas are the favoured food of monkeys. In the forest, there is a Banana Company that pr ...

  8. hdu 4055 Number String (基础dp)

    Number String Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  9. 【树形dp】The more, The Better

    [HDU1561]The more, The Better Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K ...

  10. BZOJ 2654 tree(二分答案+并查集)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2654 [题目大意] 给你一个无向带权连通图,每条边是黑色或白色. 让你求一棵最小权的恰 ...