安卓开发_慕课网_ViewPager与FragmentPagerAdapter实现Tab实现Tab(App主界面)

简介: 学习内容来自“慕课网” ViewPager与FragmentPagerAdapter实现Tab 将这两种实现Tab的方法结合起来。效果就是可以拖动内容区域来改变相应的功能图标亮暗 思路: Fragment作为内容区域 点击功能按钮,想将所有的图标变为暗色图标,再调用相应的Fragment,并使对应的图标变亮 效果图: 布局文件部分 activity_main.

学习内容来自“慕课网”

ViewPager与FragmentPagerAdapter实现Tab 将这两种实现Tab的方法结合起来。效果就是可以拖动内容区域来改变相应的功能图标亮暗

思路:

Fragment作为内容区域

点击功能按钮,想将所有的图标变为暗色图标,再调用相应的Fragment,并使对应的图标变亮

效果图:

布局文件部分

activity_main.xml

 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     xmlns:tools="http://schemas.android.com/tools"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent"
 5     android:orientation="vertical"
 6      >    
 7     <include layout="@layout/top"/>
 8     
 9     <android.support.v4.view.ViewPager   //这里是关键部分
10         android:layout_width="fill_parent"
11         android:layout_height="0dp"
12         android:layout_weight="1"
13         android:id="@+id/id_viewpager">
14         
15     </android.support.v4.view.ViewPager>
16     
17     <include layout="@layout/bottom"/>
18 </LinearLayout>
19     
activity_main

以下布局文件部分是固定的,和前两种方法用到的是一样的,做过前两种方法的可以直接复制代码

头部部分:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:layout_width="match_parent"
 4     android:background="@drawable/title_bar"
 5     android:layout_height="45dp"
 6     android:gravity="center"
 7     android:orientation="vertical" >
 8     <TextView 
 9         android:layout_height="wrap_content"
10         android:layout_width="wrap_content"
11         android:layout_gravity="center"
12         android:text="微信"
13         android:textColor="#ffffff"
14         android:textSize="20sp"
15         android:textStyle="bold"
16         
17         />
18 
19 </LinearLayout>
top.xml

底部部分

  1 <?xml version="1.0" encoding="utf-8"?>
  2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3     android:layout_width="match_parent"
  4     android:layout_height="55dp"
  5     android:background="@drawable/bottom_bar"
  6     android:orientation="horizontal" >
  7     
  8     <LinearLayout 
  9        android:id="@+id/id_tab_weixin"
 10        android:layout_width="0dp"
 11        android:gravity="center"
 12        android:layout_height="fill_parent"
 13        android:layout_weight="1"
 14        android:orientation="vertical"
 15        >
 16         <ImageButton 
 17            android:id="@+id/id_tab_weixin_image"
 18            android:layout_width="wrap_content"
 19            android:layout_height="wrap_content"
 20            android:src="@drawable/tab_weixin_pressed"
 21            android:clickable="false"
 22            android:background="#00000000"
 23            />
 24         <TextView 
 25             android:layout_width="wrap_content"
 26             android:layout_height="wrap_content"
 27             android:text="微信"
 28             android:textColor="#ffffff"
 29             />
 30     </LinearLayout>
 31     
 32     <LinearLayout 
 33        android:id="@+id/id_tab_add"
 34        android:layout_width="0dp"
 35        android:gravity="center"
 36        android:layout_height="fill_parent"
 37        android:layout_weight="1"
 38        android:orientation="vertical"
 39        >
 40         <ImageButton 
 41            android:id="@+id/id_tab_add_image"
 42            android:layout_width="wrap_content"
 43            android:layout_height="wrap_content"
 44            android:clickable="false"
 45            android:src="@drawable/tab_address_normal"
 46            android:background="#00000000"
 47            />
 48         <TextView 
 49             android:layout_width="wrap_content"
 50             android:layout_height="wrap_content"
 51             android:text="通信录"
 52             android:textColor="#ffffff"
 53             />
 54     </LinearLayout>
 55     
 56    <LinearLayout 
 57        android:id="@+id/id_tab_frd"
 58        android:layout_width="0dp"
 59        android:gravity="center"
 60        android:layout_height="fill_parent"
 61        android:layout_weight="1"
 62        android:orientation="vertical"
 63        >
 64         <ImageButton 
 65            android:id="@+id/id_tab_frd_image"
 66            android:layout_width="wrap_content"
 67            android:clickable="false"
 68            android:layout_height="wrap_content"
 69            android:src="@drawable/tab_find_frd_normal"
 70            android:background="#00000000"
 71            />
 72         <TextView 
 73             android:layout_width="wrap_content"
 74             android:layout_height="wrap_content"
 75             android:text="朋友"
 76             android:textColor="#ffffff"
 77             />
 78     </LinearLayout>
 79     
 80     <LinearLayout 
 81        android:id="@+id/id_tab_set"
 82        android:layout_width="0dp"
 83        android:gravity="center"
 84        android:layout_height="fill_parent"
 85        android:layout_weight="1"
 86        android:orientation="vertical"
 87        >
 88         <ImageButton 
 89            android:id="@+id/id_tab_set_image"
 90            android:layout_width="wrap_content"
 91            android:clickable="false"
 92            android:layout_height="wrap_content"
 93            android:src="@drawable/tab_settings_normal"
 94            android:background="#00000000"
 95            />
 96         <TextView 
 97             android:layout_width="wrap_content"
 98             android:layout_height="wrap_content"
 99             android:text="设置"
100             android:textColor="#ffffff"
101             />
102     </LinearLayout>
103 </LinearLayout>
bottom.xml

四个对应fragment部分的布局文件(相似的,只是用来标识效果的文字不同而已)

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent"
 5     android:orientation="vertical" >
 6 
 7     <TextView
 8         android:id="@+id/textView1"
 9         android:layout_width="wrap_content"
10         android:layout_height="wrap_content"
11         android:layout_gravity="center_horizontal"
12         android:text="微信"       //四个 tab_01,tab_01,tab_03,tab_04只是这里显示的文字不同而已
13         android:textAppearance="?android:attr/textAppearanceMedium" />
14 
15 </LinearLayout>
tab_01

 

.java文件部分:

主activity

MainActivity.java

  1 package com.example.tab_three;
  2 
  3 
  4 
  5 import java.util.ArrayList;
  6 import java.util.List;
  7 
  8 import android.os.Bundle;
  9 import android.app.Activity;
 10 import android.support.v4.app.Fragment;
 11 import android.support.v4.app.FragmentActivity;
 12 import android.support.v4.app.FragmentPagerAdapter;
 13 import android.support.v4.view.ViewPager;
 14 import android.support.v4.view.ViewPager.OnPageChangeListener;
 15 import android.view.Menu;
 16 import android.view.View;
 17 import android.view.View.OnClickListener;
 18 import android.view.Window;
 19 import android.widget.ImageButton;
 20 import android.widget.LinearLayout;
 21 
 22 public class MainActivity extends FragmentActivity implements OnClickListener{
 23     private ViewPager mViewPager;
 24     private FragmentPagerAdapter mAdapter; //ViewPager适配器
 25     private List<Fragment> mFragments;
 26     
 27     private LinearLayout mTabWeixin;
 28     private LinearLayout mTabFrd;
 29     private LinearLayout mTabAdd;
 30     private LinearLayout mTabSet;
 31     
 32     private ImageButton mImageWeixin;
 33     private ImageButton mImageFrd;
 34     private ImageButton mImageAdd;
 35     private ImageButton mImageSet;
 36     
 37 
 38     @Override
 39     protected void onCreate(Bundle savedInstanceState) {
 40         super.onCreate(savedInstanceState);
 41         requestWindowFeature(Window.FEATURE_NO_TITLE);
 42         setContentView(R.layout.activity_main);
 43         
 44         initView();
 45         initEvent();
 46         setSelect(0);
 47         
 48     }
 49 
 50 
 51     private void initEvent() {
 52         // TODO Auto-generated method stub
 53         mTabWeixin.setOnClickListener(this);
 54         mTabAdd.setOnClickListener(this);
 55         mTabFrd.setOnClickListener(this);
 56         mTabSet.setOnClickListener(this);
 57     }
 58 
 59 
 60     private void initView() {
 61         // TODO Auto-generated method stub
 62         //初始化
 63         mViewPager = (ViewPager) findViewById(R.id.id_viewpager);
 64         
 65         mTabWeixin = (LinearLayout) findViewById(R.id.id_tab_weixin);
 66         mTabAdd = (LinearLayout) findViewById(R.id.id_tab_add);
 67         mTabFrd = (LinearLayout) findViewById(R.id.id_tab_frd);
 68         mTabSet = (LinearLayout) findViewById(R.id.id_tab_set);
 69         
 70         mImageWeixin = (ImageButton) findViewById(R.id.id_tab_weixin_image);
 71         mImageAdd = (ImageButton) findViewById(R.id.id_tab_add_image);
 72         mImageFrd = (ImageButton) findViewById(R.id.id_tab_frd_image);
 73         mImageSet = (ImageButton) findViewById(R.id.id_tab_set_image);
 74         
 75         //数据的初始化
 76         mFragments = new ArrayList<Fragment>();
 77         Fragment mTab_01 = new WeixinFragment();
 78         Fragment mTab_02 = new AddFragment();
 79         Fragment mTab_03 = new FrdFragment();
 80         Fragment mTab_04 = new SetFragment();
 81         
 82         mFragments.add(mTab_01);
 83         mFragments.add(mTab_02);
 84         mFragments.add(mTab_03);
 85         mFragments.add(mTab_04);
 86         
 87         mAdapter = new FragmentPagerAdapter(getSupportFragmentManager())
 88         {
 89             
 90             @Override
 91             public int getCount() {
 92                 // TODO Auto-generated method stub
 93                 //返回数据源的个数
 94                 return mFragments.size();
 95                 
 96             }
 97             
 98             @Override
 99             public Fragment getItem(int arg0) {
100                 // TODO Auto-generated method stub
101                 return mFragments.get(arg0);
102             }
103         };
104         
105         mViewPager.setAdapter(mAdapter);
106         //监听内容区域的滑动效果
107         mViewPager.setOnPageChangeListener(new OnPageChangeListener() {
108             
109             @Override
110             public void onPageSelected(int arg0) {
111                 // TODO Auto-generated method stub
112                 int currentItem  = mViewPager.getCurrentItem();
113                 resetImage();
114         switch (currentItem) {
115         case 0:
116             mImageWeixin.setImageResource(R.drawable.tab_weixin_pressed);
117             break;
118         case 1:
119             mImageAdd.setImageResource(R.drawable.tab_address_pressed);
120             break;
121         case 2:
122             mImageFrd.setImageResource(R.drawable.tab_find_frd_pressed);
123             break;
124     
125         case 3:
126             mImageSet.setImageResource(R.drawable.tab_settings_pressed);
127             break;
128         default:
129             break;
130         }
131                 
132             }
133             
134             @Override
135             public void onPageScrolled(int arg0, float arg1, int arg2) {
136                 // TODO Auto-generated method stub
137                 
138             }
139             
140             @Override
141             public void onPageScrollStateChanged(int arg0) {
142                 // TODO Auto-generated method stub
143                 
144             }
145         });
146         }
147 
148 
149     @Override
150     public void onClick(View v) {
151         // TODO Auto-generated method stub
152         //先切换图片至暗色
153                 resetImage();
154                 switch (v.getId()) {
155                 case R.id.id_tab_weixin:
156                     setSelect(0);
157                     break;
158                 case R.id.id_tab_add:
159                     setSelect(1);
160                     break;
161                 case R.id.id_tab_frd:
162                     setSelect(2);
163                     break;
164                 case R.id.id_tab_set:
165                     setSelect(3);
166                     break;
167 
168                 default:
169                     break;
170                 }
171     }
172     private void setSelect(int i) {
173         // TODO Auto-generated method stub
174         //设置将点击的那个功能图标为亮色
175         //切换内容区域
176         resetImage();
177         switch (i) {
178         case 0:
179             mImageWeixin.setImageResource(R.drawable.tab_weixin_pressed);
180             break;
181         case 1:
182             mImageAdd.setImageResource(R.drawable.tab_address_pressed);
183             break;
184         case 2:
185             mImageFrd.setImageResource(R.drawable.tab_find_frd_pressed);
186             break;
187     
188         case 3:
189             mImageSet.setImageResource(R.drawable.tab_settings_pressed);
190             break;
191         default:
192             break;
193         }
194         mViewPager.setCurrentItem(i);
195         
196     }
197 
198 
199         //将所有功能图标的界面设为暗色
200         private void resetImage() {
201             // TODO Auto-generated method stub
202             mImageWeixin.setImageResource(R.drawable.tab_weixin_normal);
203             mImageAdd.setImageResource(R.drawable.tab_address_normal);
204             mImageFrd.setImageResource(R.drawable.tab_find_frd_normal);
205             mImageSet.setImageResource(R.drawable.tab_settings_normal);
206             
207         }
208 
209     
210 }
MainActivity

四个相似的.java文件

WeixinFragment.java

 1 package com.example.tab_three;
 2 
 3 import android.os.Bundle;
 4 import android.support.v4.app.Fragment;
 5 import android.view.LayoutInflater;
 6 import android.view.View;
 7 import android.view.ViewGroup;
 8 
 9 public class WeixinFragment extends Fragment{
10     
11     @Override
12     public View onCreateView(LayoutInflater inflater, ViewGroup container,
13             Bundle savedInstanceState) {
14         // TODO Auto-generated method stub
15     
16         
17         return inflater.inflate(R.layout.tab_1, container,false);
18     }
19 }
WeixinFragment.java

SetFragment.java

 1 package com.example.tab_three;
 2 
 3 import android.os.Bundle;
 4 import android.support.v4.app.Fragment;
 5 import android.view.LayoutInflater;
 6 import android.view.View;
 7 import android.view.ViewGroup;
 8 
 9 public class SetFragment extends Fragment{
10     
11     @Override
12     public View onCreateView(LayoutInflater inflater, ViewGroup container,
13             Bundle savedInstanceState) {
14         // TODO Auto-generated method stub
15     
16         
17         return inflater.inflate(R.layout.tab_4, container,false);
18     }
19 }
SetFragment.java

FrdFragment.java

 1 package com.example.tab_three;
 2 
 3 import android.os.Bundle;
 4 import android.support.v4.app.Fragment;
 5 import android.view.LayoutInflater;
 6 import android.view.View;
 7 import android.view.ViewGroup;
 8 
 9 public class FrdFragment extends Fragment{
10     @Override
11     public View onCreateView(LayoutInflater inflater, ViewGroup container,
12             Bundle savedInstanceState) {
13         // TODO Auto-generated method stub
14         return inflater.inflate(R.layout.tab_3, container,false);
15     }
16 
17 }
FrdFragment.xml

AddFragment.java

 1 package com.example.tab_three;
 2 
 3 import android.os.Bundle;
 4 import android.support.v4.app.Fragment;
 5 import android.view.LayoutInflater;
 6 import android.view.View;
 7 import android.view.ViewGroup;
 8 
 9 public class AddFragment extends Fragment{
10     
11     @Override
12     public View onCreateView(LayoutInflater inflater, ViewGroup container,
13             Bundle savedInstanceState) {
14         // TODO Auto-generated method stub
15     
16         
17         return inflater.inflate(R.layout.tab_2, container,false);
18     }
19 }
AddFragment.xml

 

相关文章
|
1月前
|
XML Java 数据库
安卓项目:app注册/登录界面设计
本文介绍了如何设计一个Android应用的注册/登录界面,包括布局文件的创建、登录和注册逻辑的实现,以及运行效果的展示。
118 0
安卓项目:app注册/登录界面设计
|
2月前
|
存储 开发工具 Android开发
使用.NET MAUI开发第一个安卓APP
【9月更文挑战第24天】使用.NET MAUI开发首个安卓APP需完成以下步骤:首先,安装Visual Studio 2022并勾选“.NET Multi-platform App UI development”工作负载;接着,安装Android SDK。然后,创建新项目时选择“.NET Multi-platform App (MAUI)”模板,并仅针对Android平台进行配置。了解项目结构,包括`.csproj`配置文件、`Properties`配置文件夹、平台特定代码及共享代码等。
123 2
|
3月前
|
IDE Java 开发工具
探索安卓开发之旅:打造你的第一款App
【8月更文挑战第24天】在这篇文章中,我们将一起踏上激动人心的安卓开发之旅。不论你是编程新手还是希望扩展技能的老手,本文将为你提供一份详尽指南,帮助你理解安卓开发的基础知识并实现你的第一个应用程序。从搭建开发环境到编写“Hello World”,每一步都将用浅显易懂的语言进行解释。那么,让我们开始吧!
|
3月前
|
开发工具 Android开发
|
3月前
|
XML Android开发 UED
"掌握安卓开发新境界:深度解析AndroidManifest.xml中的Intent-filter配置,让你的App轻松响应scheme_url,开启无限交互可能!"
【8月更文挑战第2天】在安卓开发中,scheme_url 通过在`AndroidManifest.xml`中配置`Intent-filter`,使应用能响应特定URL启动或执行操作。基本配置下,应用可通过定义特定URL模式的`Intent-filter`响应相应链接。
108 12
|
3月前
|
存储 XML Linux
深入理解操作系统:进程管理与调度策略探索安卓应用开发:从零开始构建你的第一个App
【8月更文挑战第28天】在数字世界里航行,操作系统是掌控一切的舵手。本文将带你领略操作系统的精妙设计,特别是进程管理和调度策略这两大核心领域。我们将从基础概念出发,逐步深入到复杂的实现机制,最后通过实际代码示例,揭示操作系统如何高效协调资源,确保多任务顺畅运行的秘密。准备好了吗?让我们启航,探索那些隐藏在日常电脑使用背后的奥秘。 【8月更文挑战第28天】在这个数字时代,拥有一款自己的移动应用程序不仅是技术的展示,也是实现创意和解决问题的一种方式。本文将引导初学者了解安卓开发的基础知识,通过一个简单的待办事项列表App项目,逐步介绍如何利用安卓开发工具和语言来创建、测试并发布一个基本的安卓应用
|
3月前
|
Java 程序员 Android开发
探索安卓开发:构建你的第一个App
【8月更文挑战第27天】在数字化时代的浪潮中,移动应用成为人们生活不可或缺的一部分。对于渴望进入软件开发领域的新手而言,掌握如何构建一款简单的安卓App是开启技术之旅的关键一步。本文旨在通过浅显易懂的语言和步骤分解,引导初学者了解安卓开发的基础知识,并跟随示例代码,一步步实现自己的第一个安卓App。从环境搭建到界面设计,再到功能实现,我们将一同揭开编程的神秘面纱,让每个人都能体会到创造软件的乐趣。
|
4月前
|
Android开发 Kotlin
kotlin开发安卓app,如何让布局自适应系统传统导航和全面屏导航
使用`navigationBarsPadding()`修饰符实现界面自适应,自动处理底部导航栏的内边距,再加上`.padding(bottom = 10.dp)`设定内容与屏幕底部的距离,以完成全面的布局适配。示例代码采用Kotlin。
127 15
|
4月前
|
存储 API Android开发
kotlin开发安卓app,使用webivew 触发 onShowFileChooser, 但只能触发一次,第二次无法触发,是怎么回事。 如何解决
在Android WebView开发中,`onShowFileChooser`方法用于开启文件选择。当用户只能选择一次文件可能是因为未正确处理选择回调。解决此问题需确保:1) 实现`WebChromeClient`并覆写`onShowFileChooser`;2) 用户选择文件后调用`ValueCallback.onReceiveValue`传递URI;3) 传递结果后将`ValueCallback`设为`null`以允许再次选择。下面是一个Kotlin示例,展示如何处理文件选择和结果回调。别忘了在Android 6.0+动态请求存储权限,以及在Android 10+处理分区存储。
|
4月前
|
存储 移动开发 Android开发
使用kotlin Jetpack Compose框架开发安卓app, webview中h5如何访问手机存储上传文件
在Kotlin和Jetpack Compose中,集成WebView以支持HTML5页面访问手机存储及上传音频文件涉及关键步骤:1) 添加`READ_EXTERNAL_STORAGE`和`WRITE_EXTERNAL_STORAGE`权限,考虑Android 11的分区存储;2) 配置WebView允许JavaScript和文件访问,启用`javaScriptEnabled`、`allowFileAccess`等设置;3) HTML5页面使用`<input type="file">`让用户选择文件,利用File API;