[android更新类的内容开发APP]四、项目布局的基本功能(继续)
昨天,只拿到电脑,别说,眼泪
http://joveth.github.io/funny/
1.选项卡的滑动效果
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" > <TabHost
android:id="@+id/tab_host"
android:layout_width="match_parent"
android:layout_height="match_parent" > <LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" > <TabWidget
android:id="@android:id/tabs"
android:layout_width="match_parent"
android:layout_height="48dp"
android:background="@drawable/tab_widget_bg" /> <android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="match_parent"
android:layout_height="match_parent" /> <!-- 隐藏 --> <FrameLayout
android:id="@android:id/tabcontent"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="gone" > <fragment
android:id="@+id/fragment_image"
android:name="com.jov.germany.frame.ImageFrame"
android:layout_width="match_parent"
android:layout_height="match_parent" /> <fragment
android:id="@+id/fragment_text"
android:name="com.jov.germany.frame.TextFrame"
android:layout_width="match_parent"
android:layout_height="match_parent" /> <fragment
android:id="@+id/fragment_both"
android:name="com.jov.germany.frame.BothFrame"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</FrameLayout>
</LinearLayout>
</TabHost> </LinearLayout>
<?xml version="1.0" encoding="utf-8"?> <!-- 标签页tab 文字切换颜色 -->
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_selected="true" android:color="@color/color_orange"/> <item android:color="#000"/> </selector>
value/color.xml中加入:
<color name="color_orange">#FF9224</color>
为啥是橘黄,我……假设你不喜欢,百度HTML颜色代码表,找一个你 自己的最爱
package com.jov.germany; import java.util.ArrayList;
import java.util.List; import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TabHost;
import android.widget.TabHost.OnTabChangeListener;
import android.widget.TabHost.TabContentFactory;
import android.widget.TabHost.TabSpec;
import android.widget.TextView; public class MainActivity extends FragmentActivity {
public static final String PAGE1_ID = "page1";
public static final String PAGE2_ID = "page2";
public static final String PAGE3_ID = "page3"; private TabHost tabHost; // TabHost
private List<View> views; // ViewPager内的View对象集合
private FragmentManager manager; // Activity管理器
private ViewPager pager; // ViewPager @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); // 初始化资源
pager = (ViewPager) findViewById(R.id.viewpager);
tabHost = (TabHost) findViewById(R.id.tab_host);
manager = getSupportFragmentManager();
views = new ArrayList<View>(); views.add(manager.findFragmentById(R.id.fragment_image).getView());
views.add(manager.findFragmentById(R.id.fragment_text).getView());
views.add(manager.findFragmentById(R.id.fragment_both).getView()); // 管理tabHost開始
tabHost.setup(); // 传一个空的内容给TabHost,不能用上面两个fragment
TabContentFactory factory = new TabContentFactory() {
@Override
public View createTabContent(String tag) {
return new View(MainActivity.this);
}
};
// tab1
TabSpec tabSpec = tabHost.newTabSpec(PAGE1_ID);
tabSpec.setIndicator(createTabView(R.string.fragment_image_str));
tabSpec.setContent(factory);
tabHost.addTab(tabSpec);
// tab2
TabSpec tabSpec2 = tabHost.newTabSpec(PAGE2_ID);
tabSpec2.setIndicator(createTabView(R.string.fragment_text_str));
tabSpec2.setContent(factory);
tabHost.addTab(tabSpec2);
// tab3
TabSpec tabSpec3 = tabHost.newTabSpec(PAGE3_ID);
tabSpec3.setIndicator(createTabView(R.string.fragment_both_str));
tabSpec3.setContent(factory);
tabHost.addTab(tabSpec3); tabHost.setCurrentTab(0);
// 管理tabHost结束 // 设置监听器和适配器
pager.setAdapter(new PageAdapter());
pager.setOnPageChangeListener(new PageChangeListener());
tabHost.setOnTabChangedListener(new TabChangeListener());
} /**
* PageView Adapter
*
* @author Administrator
*
*/
private class PageAdapter extends PagerAdapter {
@Override
public int getCount() {
return views.size();
} @Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == arg1;
} @Override
public void destroyItem(ViewGroup view, int position, Object arg2) {
view.removeView(views.get(position));
} @Override
public Object instantiateItem(ViewGroup view, int position) {
try {
if (views.get(position).getParent() == null) {
view.addView(views.get(position));
} else {
((ViewGroup) views.get(position).getParent())
.removeView(views.get(position));
view.addView(views.get(position));
}
} catch (Exception e) {
e.printStackTrace();
}
return views.get(position);
}
} /**
* 标签页点击切换监听器
*
* @author Administrator
*
*/
private class TabChangeListener implements OnTabChangeListener {
@Override
public void onTabChanged(String tabId) {
if (PAGE1_ID.equals(tabId)) {
pager.setCurrentItem(0);
} else if (PAGE2_ID.equals(tabId)) {
pager.setCurrentItem(1);
} else if (PAGE3_ID.equals(tabId)) {
pager.setCurrentItem(2);
}
}
} /**
* ViewPager滑动切换监听器
*
* @author Administrator
*
*/
private class PageChangeListener implements OnPageChangeListener {
@Override
public void onPageScrollStateChanged(int arg0) {
} @Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
} @Override
public void onPageSelected(int arg0) {
tabHost.setCurrentTab(arg0);
}
} /**
* 创建tab View
*
* @param string
* @return
*/
private View createTabView(int stringId) {
View tabView = getLayoutInflater().inflate(R.layout.tab, null);
TextView textView = (TextView) tabView.findViewById(R.id.tab_text);
textView.setText(stringId);
return tabView;
} @Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
} @Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
当中的layout/tab.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="@drawable/state_tabs_bg" > <TextView
android:id="@+id/tab_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="11dp"
android:layout_gravity="center_horizontal"
android:textSize="18sp"
android:textColor="@color/tab_widget_text"/> </LinearLayout>
drawable/state_tabs_bg.xml
<?xml version="1.0" encoding="utf-8"? > <!-- tab每一个标签背景 -->
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_selected="true" android:drawable="@drawable/tabs_selected_bg" /> <item android:drawable="@drawable/tabs_normal_bg"></item> </selector>
drawable/tabs_selected_bg.xml
<?xml version="1.0" encoding="UTF-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" > <item>
<shape>
<solid android:color="@color/color_orange" />
</shape>
</item>
<item android:bottom="5dp">
<shape>
<solid android:color="#eeeeee" />
</shape>
</item> </layer-list>
drawable/tabs_normal_bg.xml
<?xml version="1.0" encoding="UTF-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item>
<shape>
<solid android:color="@color/color_orange" />
</shape>
</item>
<item android:bottom="1dp">
<shape>
<solid android:color="#eeeeee" />
</shape>
</item> </layer-list>
package com.jov.germany.frame; import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup; import com.jov.germany.R; public class ImageFrame extends Fragment{
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.image_frame, container, false);
}
}
你可能会认为没什么差别,看一下我们的Fragment引用的包,不一样哦。
近期各种忙,更新的 有点慢,没办法啊
版权声明:本文博客原创文章,博客,未经同意,不得转载。
[android更新类的内容开发APP]四、项目布局的基本功能(继续)的更多相关文章
- Android系统移植与驱动开发--第四章
第四章 源代码的下载和编译 一个android内核相当于4G,而一个Linux内个只有几百M,Linux内核相对于android内核来说实在是小巫见大巫.了解android源代码不一定要详细了解,只去 ...
- 【Android】13.0 UI开发(四)——列表控件RecyclerView的横向布局排列实现
1.0 新建项目,由于ListView的局限性,RecyclerView是一种很好取代ListView的控件,可以灵活实现多种布局. 2.0 新建项目RecyclerviewTest,目录如下: 3. ...
- 深入浅出 - Android系统移植与平台开发(四)- Android启动流程
作者:唐老师,华清远见嵌入式学院讲师. 一.Android init进程启动 还是从Linux的启动开始吧.Linux被bootloader加载到了内存之后,开始运行,在初始化完 Linux运行环境之 ...
- H5 + 开发App(分享功能)
我们开发App有一个不可少的功能,就是分享功能.让用户将app分享到他的社交圈.比如微信 QQ 微博等等. 准备工作:我们要先去申请相关的权限, 这是传送门http://ask.dcloud.net. ...
- VS2013开发Windows服务项目
这篇随笔里,我将介绍如何用VS2013开发Windows服务项目,实现的功能是定时发送电子邮件. 开发环境:VS2013,SQL Server2008,采用C#语言开发 步骤一:创建Windows服务 ...
- 基于.NetCore开发博客项目 StarBlog - (2) 环境准备和创建项目
系列文章 基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客? 基于.NetCore开发博客项目 StarBlog - (2) 环境准备和创建项目 ... 基于. ...
- 基于.NetCore开发博客项目 StarBlog - (3) 模型设计
系列文章 基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客? 基于.NetCore开发博客项目 StarBlog - (2) 环境准备和创建项目 基于.NetC ...
- mui开发app之自定义事件以更新其他页内容
我之前做过jquery mobile的开发,那还是前年的事情 在jquery mobile中,由于页面是存储在div[data-role=page]的dom中(jqmobile通过对data-role ...
- Cordova开发App入门之创建android项目
Apache Cordova是一个开源的移动开发框架.允许使用标准的web技术-HTML5,CSS3和JavaScript做跨平台开发. 应用在每个平台的具体执行被封装了起来,并依靠符合标准的API绑 ...
随机推荐
- php  性能优化
基础优化 1 不要随便复制变量. 有时候为了使 PHP 代码更加整洁,一些 PHP 新手(包含我)会把提前定义好的变量拷贝到一个名字更简短的变量中,事实上这样做的结果是添加了一倍的内存消耗,仅仅会使程 ...
- MFC漆摘要-截图,获得DIB/DDB图形Pixel
1. 当前Screen进行Copy屏幕,获得BITMAP 当前屏幕Copy.须要获取当前屏幕的HDC, 一种是直接从屏幕DC抓原始图. 一种是然后使用兼容MemDC进行抓图,然后能够附加图 ...
- ajax方式提交带文件上传的表单,上传后不跳转
ajax方式提交带文件上传的表单 一般的表单都是通过ajax方式提交,所以碰到带文件上传的表单就比较麻烦.基本原理就是在页面增加一个隐藏iframe,然后通过ajax提交除文件之外的表单数据,在表单数 ...
- WPF绘制党徽(立体效果,Cool)
原文:WPF绘制党徽(立体效果,Cool) 前面用WPF方式绘制了党旗(WPF制作的党旗) ,去年3月份利用C# 及GDI+绘制过党徽,这次使用WPF来绘制党徽. ------------------ ...
- C# WinForm多线程(二)ThreadPool 与 Timer
本文接上文,继续探讨WinForm中的多线程问题,再次主要探讨threadpool 和timer 一 ThreadPool 线程池(ThreadPool)是一种相对较简单的方法,它适应于一些需要多个 ...
- 自动同步Android源代码的脚本(repo sync)
#!/bin/bash echo "================start repo sync====================" repo sync -j5 ]; do ...
- Lua 服务器Socket通信实例(转)
local socket = require"socket" local host = "127.0.0.1"local port = "843&qu ...
- 解决apache+tomcatserver环境中文乱码的问题
在使用apache做转发服务器时,碰到了中文乱码的问题. 说说解决思路: 1.通常乱码是由于编码不统一造成的.所以要先推断是不是由于编码问题造成的,假设是的话,那统一编码就能够去解决. 2.tomca ...
- Duanxx的STM32学习: 启动模式,BOOT0和BOOT1具体解释
在画STM32的电路图的时候,关于STM32的启动方式纠结了一下,现有的參考设计都是在STM32的启动选择引脚BOOT0和BOOT1上使用了跳帽,用以人工选择STM32的启动方式,可是在实际应用中这样 ...
- OWIN编写中间件
OWIN系列之自己动手编写中间件 一.前言 1.基于OWIN的项目摆脱System.Web束缚脱颖而出,轻量级+跨平台,使得ASP.NET应用程序只需依赖这个抽象接口,不用关心所运行的Web服务器. ...