导航:首页 > 源码编译 > viewpager2源码

viewpager2源码

发布时间:2022-04-22 15:19:12

A. 求助在android studio 中引用viewpagerindicator的方法

请按照如下方法操作即可:

1. 使用 maven 导入。
1) 在最顶层的Build.gradle 中添加如下代码:
buildscript {
repositories {
maven { url "http://dl.bintray.com/populov/maven" }
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.12.+'
}
}
allprojects {
repositories {
maven { url "http://dl.bintray.com/populov/maven" }
mavenCentral()
}
}
2) 在app’s的build.gradle添加compile 'com.viewpagerindicator:library:2.4.1',
以后想添加什么第三方的库,只需要在 http://search.maven.org/ 中搜索,然后添加在第2中就行了。

2. 下载好源码,添加已经下载好的源码。
1)下载 source code
2) 在你的 Android Studio Project: File -> Project Structure -> add (+ symbol) -> Import Existing Project,导入library文件夹而不是整个工程 (leave the import options as Android Studio suggests)。
3) 按步骤设置(SDK 版本),然后点击下一步。
4) 在你app的build.gradle中添加依赖 dependencies { compile project ( ':library' ) }。

注意:如果项目中已经存在了support-v4,需要删除,因为添加的 Android-ViewPagerIndicator 会包含这个库。在一个工程中不能有两个这样的库(工程会共用库中的这个jar)。如果 Android-ViewPagerIndicator Library 中的support-v4 不能满足你的要求,那只能用第2种方法,下载好后,把你要的support-v4替换Library文件夹中的,然后按步骤进行即可。

B. android viewpager跟着listview上下联动

1. 针对viewpager 做了些修改
替换掉support.v4当中的viewpager即可:

[java] view plain
package com.example.bz_viewpager;

import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.ViewGroup;

/**
* viewpage 和listview 相互冲突 将父view 传递到viewpage 里面
*
* 使用父类的方法 parent.(true);
*
* 当 如果为true的时候 表示:父view 不拦截子view的touch 事件
*
* 这个方法只是改变flag
*
* @author baozi
*
*/
public class DecoratorViewPager extends ViewPager {
private ViewGroup parent;

public DecoratorViewPager(Context context) {
super(context);
// TODO Auto-generated constructor stub
}

public DecoratorViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}

public void setNestedpParent(ViewGroup parent) {
this.parent = parent;
}

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
if (parent != null) {
parent.(true);
}
return super.dispatchTouchEvent(ev);
}

@Override
public boolean onInterceptTouchEvent(MotionEvent arg0) {
if (parent != null) {
parent.(true);
}
return super.onInterceptTouchEvent(arg0);
}

@Override
public boolean onTouchEvent(MotionEvent arg0) {
if (parent != null) {
parent.(true);
}
return super.onTouchEvent(arg0);
}

}

2 . 在xml里面:

[html] view plain
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#f1f1f1" >

<com.example.bz_viewpager.DecoratorViewPager
android:id="@+id/vp"
android:layout_width="match_parent"
android:layout_height="200dp"
android:fadingEdge="none" />

</RelativeLayout>

3. 在代码里使用

将 viewpager 的父view传递到viewpager里面
调用: vp.setNestedpParent((ViewGroup)vp.getParent()); 方法
如下:

[java] view plain
lv = (ListView) findViewById(R.id.lv);

View header = LayoutInflater.from(MainActivity.this).inflate(R.layout.viewpage_layout, null);
DecoratorViewPager vp = (DecoratorViewPager) header.findViewById(R.id.vp);
vp.setNestedpParent((ViewGroup)vp.getParent());

MyPagapter myPagapter = new MyPagapter(MainActivity.this);
vp.setAdapter(myPagapter);
lv.addHeaderView(header);

(2)解析:
viewgroup 当中有 一个 方法
这个方法只改变flag 当 view. 参数为true的时候
view 不会拦截其子控件的 触摸事件

[java] view plain
/**
* Called when a child does not want this parent and its ancestors to
* intercept touch events with
* {@link ViewGroup#onInterceptTouchEvent(MotionEvent)}.
*
* <p>This parent should pass this call onto its parents. This parent must obey
* this request for the ration of the touch (that is, only clear the flag
* after this parent has received an up or a cancel.</p>
*
* @param disallowIntercept True if the child does not want the parent to
* intercept touch events.
*/
public void (boolean disallowIntercept);

贴上源码:

[java] view plain
public void (boolean disallowIntercept) {

if (disallowIntercept == ((mGroupFlags & FLAG_DISALLOW_INTERCEPT) != 0)) {
// We're already in this state, assume our ancestors are too
return;
}

if (disallowIntercept) {
mGroupFlags |= FLAG_DISALLOW_INTERCEPT;
} else {
mGroupFlags &= ~FLAG_DISALLOW_INTERCEPT;
}

// Pass it up to our parent
if (mParent != null) {
mParent.(disallowIntercept);
}
}

C. 如何更新及替换ViewPager中的Fragment

实方法很简单,只是一开始想复杂了,然后去StackOverflow上看到的各种答案就更迷糊了.
主要思维偏了就完了.
ViewPager里放的不管是Fragment还是Layout,这都是个Adapter容器.因此你要更改里面的东西,最正确的方法就是去修改Adapter里的数据.
替换步骤需要:
1.删除FragmentManager现有的当前页面的Fragment.
我用的是mFm.beginTransaction().remove(mFm.findFragmentByTag("android:switcher:" + R.id.view_pager + ":" + position)).commit();因为看源码你会发现添加的时候是用这个Tag去添加的.或许如果保存了个FragmentList也可以直接获取.
2.修改Adapter里的数据.
然后notifyDataSetChanged();
这里需要说一点,有些时候调用了notify也不会刷新,好像是缓存的原因.需要覆写方法
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;//返回这个表示该对象已改变,需要刷新
return POSITION_UNCHANGED;//反之不刷新
}

然后替换了当然还需要做到按返回键返回上一个Fragment.
我的方法
1.Adapter里两个List,里面都保存Fragment的类名.替换的时候把一个List里的数据修改
2.在Activity的onBackPress()方法里调用Adapter自定义的backPress()方法,在该方法里去判断两个List的该position是否相同,不同则再操作一遍替换操作.相同则Activity退出.

D. 求一套完整的JAVA WEB项目的网络购物网站源代码

/**
*@description:
*@authorchenshiqiangE-mail:[email protected]
*@date2014年9月7日下午2:51:50
*@version1.0
*/
packagecom.example.map;

importjava.util.ArrayList;
importjava.util.Collections;
importjava.util.HashSet;
importjava.util.List;
importandroid.app.Activity;
importandroid.os.Bundle;
importandroid.support.v4.view.PagerAdapter;
importandroid.support.v4.view.PagerTabStrip;
importandroid.support.v4.view.ViewPager;
importandroid.text.Editable;
importandroid.util.Log;
importandroid.view.LayoutInflater;
importandroid.view.View;
importandroid.view.ViewGroup;
importandroid.widget.ExpandableListView;
importandroid.widget.ListView;
importcom..mapapi.map.offline.MKOLSearchRecord;
importcom..mapapi.map.offline.MKOLUpdateElement;
importcom..mapapi.map.offline.MKOfflineMap;
importcom..mapapi.map.offline.MKOfflineMapListener;
importcom.example.map.adapters.OfflineExpandableListAdapter;
importcom.example.map.adapters.OfflineMapAdapter;
importcom.example.map.adapters.OfflineMapManagerAdapter;
importcom.example.map.interfaces.;
importcom.example.map.models.OfflineMapItem;
importcom.example.map.utils.CsqBackgroundTask;
importcom.example.map.utils.ToastUtil;
importcom.example.system.R;

istener,
{

//------------------------Constants------------------------

//-------------------------Fields--------------------------

privateViewPagerviewpager;
privatePagerTabStrippagertab;

privateMySearchViewsvDown;
privateListViewlvDown;

privateMySearchViewsvAll;
;
privateListViewlvSearchResult;

privateList<View>views=newArrayList<View>(2);
privateList<String>titles=newArrayList<String>(2);

privateMKOfflineMapmOffline=null;

;
;
;

privateList<OfflineMapItem>itemsDown;//下载或下载中城市
privateList<OfflineMapItem>itemsAll;//所有城市,与热门城市及下载管理对象相同

privateList<OfflineMapItem>itemsProvince;
privateList<List<OfflineMapItem>>itemsProvinceCity;

//-----------------------Constructors----------------------

//--------Methodsfor/fromSuperClass/Interfaces-----------

@Override
protectedvoidonCreate(BundlesavedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_offline_map);

// finalStringpackname=this.getPackageName();
// PackageInfopackageInfo;
// try
// {
// packageInfo=this.getPackageManager().getPackageInfo(packname,PackageManager.GET_SIGNATURES);
//
//
// if(code==-00)
// {
//初始化离线地图管理
mOffline=newMKOfflineMap();
mOffline.init(this);

initViews();

viewpager.setCurrentItem(1);
// }
// }
// catch(NameNotFoundExceptione)
// {
// e.printStackTrace();
// }
}

privatebooleanisResumed=false;

@Override
protectedvoidonResume()
{
super.onResume();

if(!isResumed)
{
isResumed=true;
loadData();
}
}

@Override
protectedvoidonDestroy()
{
super.onDestroy();

mOffline.destroy();
}

/**
*
*@authorchenshiqiangE-mail:[email protected]
*@paramtype
*事件类型:MKOfflineMap.TYPE_NEW_OFFLINE,MKOfflineMap.TYPE_DOWNLOAD_UPDATE,MKOfflineMap.TYPE_VER_UPDATE.
*@paramstate
*事件状态:当type为TYPE_NEW_OFFLINE时,表示新安装的离线地图数目.当type为TYPE_DOWNLOAD_UPDATE时,表示更新的城市ID.
*/
@Override
(inttype,intstate)
{
switch(type)
{
caseMKOfflineMap.TYPE_DOWNLOAD_UPDATE:
MKOLUpdateElementupdate=mOffline.getUpdateInfo(state);

if(setElement(update,true)!=null)
{
if(itemsDown!=null&&itemsDown.size()>1)
{
Collections.sort(itemsDown);
}

refreshDownList();

}
else
{
downAdapter.notifyDataSetChanged();
}

allSearchAdapter.notifyDataSetChanged();
allCountryAdapter.notifyDataSetChanged();
break;

caseMKOfflineMap.TYPE_NEW_OFFLINE:
//有新离线地图安装
Log.d("OfflineDemo",String.format("addofflinemapnum:%d",state));
break;

caseMKOfflineMap.TYPE_VER_UPDATE:
//版本更新提示
break;
}
}

/**
*网络下载状态改变(暂停--》恢复)居然不回调,所以改变状态时自己得增加接口监听状态改变刷新界面
*
*@authorchenshiqiangE-mail:[email protected]
*@paramitem
*有状态改变的item
*@paramremoved
*item是否被删除
*/
@Override
publicvoidstatusChanged(OfflineMapItemitem,booleanremoved)
{
if(removed)
{
for(inti=itemsDown.size()-1;i>=0;i--)
{
OfflineMapItemtemp=itemsDown.get(i);
if(temp.getCityId()==item.getCityId())
{
itemsDown.remove(i);
}
}
refreshDownList();

}
else
{
loadData();
downAdapter.notifyDataSetChanged();
}

allSearchAdapter.notifyDataSetChanged();
allCountryAdapter.notifyDataSetChanged();
}

//---------------------Methodspublic----------------------

publicvoidtoDownloadPage()
{
viewpager.setCurrentItem(0);
}

//---------------------Methodsprivate---------------------

privatevoidinitViews()
{
//TODO
viewpager=(ViewPager)findViewById(R.id.viewpager);
pagertab=(PagerTabStrip)findViewById(R.id.pagertab);

LayoutInflaterinf=LayoutInflater.from(this);
Viewv1=inf.inflate(R.layout.view_offline_download,null,false);
svDown=(MySearchView)v1.findViewById(R.id.svDown);
lvDown=(ListView)v1.findViewById(R.id.lvDown);
views.add(v1);

Viewv2=inf.inflate(R.layout.view_offline_countrys,null,false);
svAll=(MySearchView)v2.findViewById(R.id.svAll);
lvWholeCountry=(ExpandableListView)v2.findViewById(R.id.lvWholeCountry);
lvSearchResult=(ListView)v2.findViewById(R.id.lvSearchResult);
views.add(v2);

titles.add("下载管理");
titles.add("城市列表");

pagertab.setTabIndicatorColor(0xff00cccc);
pagertab.setDrawFullUnderline(false);
pagertab.setBackgroundColor(0xFF38B0DE);
pagertab.setTextSpacing(50);

viewpager.setOffscreenPageLimit(2);
viewpager.setAdapter(newMyPagerAdapter());

svDown.setSearchListener(newMySearchView.SearchListener()
{
@Override
publicvoidafterTextChanged(Editabletext)
{
refreshDownList();
}

@Override
publicvoidsearch(Stringtext)
{
}
});

svAll.setSearchListener(newMySearchView.SearchListener()
{
@Override
publicvoidafterTextChanged(Editabletext)
{
refreshAllSearchList();
}

@Override
publicvoidsearch(Stringtext)
{
}
});

downAdapter=newOfflineMapManagerAdapter(this,mOffline,this);
lvDown.setAdapter(downAdapter);

allSearchAdapter=newOfflineMapAdapter(this,mOffline,this);
lvSearchResult.setAdapter(allSearchAdapter);

allCountryAdapter=(this,mOffline,this);
lvWholeCountry.setAdapter(allCountryAdapter);
lvWholeCountry.setGroupIndicator(null);
}

/**
*刷新下载列表,根据搜索关键字及itemsDown下载管理数量变动时调用
*/
privatevoidrefreshDownList()
{
Stringkey=svDown.getInputText();
if(key==null||key.length()<1)
{
downAdapter.setDatas(itemsDown);

}
else
{
List<OfflineMapItem>filterList=newArrayList<OfflineMapItem>();
if(itemsDown!=null&&!itemsDown.isEmpty())
{
for(OfflineMapItemi:itemsDown)
{
if(i.getCityName().contains(key))
{
filterList.add(i);
}
}
}

downAdapter.setDatas(filterList);
}
}

/**
*刷新所有城市搜索结果
*/
()
{
Stringkey=svAll.getInputText();
if(key==null||key.length()<1)
{
lvSearchResult.setVisibility(View.GONE);
lvWholeCountry.setVisibility(View.VISIBLE);

allSearchAdapter.setDatas(null);

}
else
{
lvSearchResult.setVisibility(View.VISIBLE);
lvWholeCountry.setVisibility(View.GONE);

List<OfflineMapItem>filterList=newArrayList<OfflineMapItem>();
if(itemsAll!=null&&!itemsAll.isEmpty())
{
for(OfflineMapItemi:itemsAll)
{
if(i.getCityName().contains(key))
{
filterList.add(i);
}
}
}

allSearchAdapter.setDatas(filterList);
}
}

privatevoidloadData()
{

newCsqBackgroundTask<Void>(this)
{
@Override
protectedVoidonRun()
{
//TODOAuto-generatedmethodstub
//导入离线地图包
//将从官网下载的离线包解压,把vmp文件夹拷入SD卡根目录下的BaiMapSdk文件夹内。
//把网站上下载的文件解压,将BaiMapvmpl里面的.dat_svc文件,拷贝到手机BaiMapSDK/vmp/h目录下
intnum=mOffline.importOfflineData();
if(num>0)
{
ToastUtil.showToastInfo(BaiOfflineMapActivity.this,"成功导入"+num+"个离线包",false);
}

List<MKOLSearchRecord>all=null;
try
{
all=mOffline.getOfflineCityList();
}
catch(Exceptione)
{
e.printStackTrace();
}
if(all==null||all.isEmpty())
{
ToastUtil.showToastInfo(BaiOfflineMapActivity.this,"未获取到离线地图城市数据,可能有其他应用正在使用网络离线地图功能!",false);
returnnull;
}

List<MKOLSearchRecord>hotCity=mOffline.getHotCityList();
HashSet<Integer>hotCityIds=newHashSet<Integer>();
if(!hotCity.isEmpty())
{
for(MKOLSearchRecordr:hotCity)
{
hotCityIds.add(r.cityID);
}
}

itemsAll=newArrayList<OfflineMapItem>();
itemsDown=newArrayList<OfflineMapItem>();
itemsProvince=newArrayList<OfflineMapItem>();
itemsProvinceCity=newArrayList<List<OfflineMapItem>>();

//cityType0:全国;1:省份;2:城市,如果是省份,可以通过childCities得到子城市列表

//全国概略图、直辖市、港澳子城市列表
ArrayList<MKOLSearchRecord>childMunicipalities=newArrayList<MKOLSearchRecord>();

proHot.cityName="热门城市";
proHot.childCities=cs;
List<MKOLUpdateElement>updates=mOffline.getAllUpdateInfo();
if(updates!=null&&updates.size()>0)
{
}

@Override
protectedvoidonResult(Voidresult)
{
//TODOAuto-generatedmethodstub
refreshDownList();
refreshAllSearchList();

allCountryAdapter.setDatas(itemsProvince,itemsProvinceCity);
}
}.execute();
}

E. android viewpager中怎么监听按钮事件,求源码~~!!

public class ViewPagerActor extends LinearLayout{
private ViewPager viewPager;
private MyAdapter myAdapter;
private List<View> lists;
public ViewPagerActor(Context context, AttributeSet attrs) {
super(context, attrs);
LayoutInflater inflater =LayoutInflater.from(context);
inflater.inflate(R.drawable.actor_viewpager_layout, this, true);
viewPager = (ViewPager)findViewById(R.id.viewpager);//这个滚动页面
}

public void setDates(List<View> lists){
this.lists = lists;
}
public void initDisplay(){
myAdapter = new MyAdapter(lists);
viewPager.setAdapter(myAdapter);
}
public void notifyDataSetChanged(){
myAdapter.notifyDataSetChanged();
}

/**
* 设置显示第几页
* @param count
*/
public void setCurrentItem(int count){
viewPager.setCurrentItem(count);
}

/**
* 为 viewPager 添加换页监听器
* @param onPageChangeListener
*/
public void setOnPageChangeListener(OnPageChangeListener onPageChangeListener){
viewPager.setOnPageChangeListener(onPageChangeListener);
}

/**
* viewPager 固定的适配器 继承PagerAdapter
* @author Administrator
*
*/
class MyAdapter extends PagerAdapter {
private List<View> views;

public MyAdapter(List<View> lists){
this.views = lists;
}
@Override
public int getCount() {
return views.size();
}

@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == arg1;
}

@Override
public int getItemPosition(Object object) {
return super.getItemPosition(object);
}

@Override
public void destroyItem(View arg0, int arg1, Object arg2) {
if(views.get(arg1)!=null){
((ViewPager)arg0).removeView(views.get(arg1));
}
}

@Override
public Object instantiateItem(View arg0, int arg1) {
((ViewPager)arg0).addView(views.get(arg1),0);
return views.get(arg1);
}
}
}

上面的类你可以保存下来了 那是个通用的滑动切屏

将上面的类 注入到你要运行的activity类的xml中
在activity中
View compassView = makeCompassView();第一个页面
compassView.setOnClickListener(this.addUueeyeListener);//这个就是加监听器
如果你想给这个view中的别的控件加监听一样 直接掉例如
compassView.findViewBy().set监听
View dataView = makeDataView();第二个页面
this.viewDatas.add(compassView);
this.viewDatas.add(dataView);
this.viewPagerActor.setDates(this.viewDatas);赋值给上面滑动中
this.viewPagerActor.initDisplay();//上面有这个方法你自己看

希望你能看懂

F. github 上有什么价值的android 源码

1. ActionBarSherlock

ActionBarSherlock应该算得上是GitHub上最火的Android开源项目了,它是一个独立的库,通过一个API和主题,开发者就可以很方便地使用所有版本的Android动作栏的设计模式。

对于Android
4.0及更高版本,ActionBarSherlock可以自动使用本地ActionBar实现,而对于之前没有ActionBar功能的版本,基于
Ice Cream Sandwich的自定义动作栏实现将自动围绕布局。能够让开发者轻松开发一款带动作栏(Action
bar)的应用,并且适用于Android 2.x及其以上所有版本。

详情请参考:ActionBarSherlock

2. facebook-android-sdk

Facebook SDK for Android是一个开源库,允许开发者将Facebook集成到所开发的Android应用中。

如果想要获取更多关于示例、文档、将SDK集成到App中、源代码等信息,可直接登陆Facebook Developers查看。

3. SlidingMenu(SlidingMenu Demos)

SlidingMenu是一个开源的Android库,能够让开发者轻松开发一款应用,实现类似于Google+、Youtube和Facebook应用中非常流行的滑动式菜单。

使用SlidingMenu的Android应用:

Foursquare
Rdio
Plume
VLC for Android
ESPN ScoreCenter
MLS MatchDay
9GAG
Wunderlist 2
The Verge
MTG Familiar
Mantano Reader
Falcon Pro (BETA)
MW3 Barracks

4. cocos2d-x

在移动开发领域,将Cocos2D-X用于主流iOS/Android游戏开发的公司、开发团队多不胜数。cocos2d-x是一个开源的支持多平
台的2D游戏框架,使用C++开发,基于cocos2d-iphone,在MIT许可证下发布。主分支在GitHub上使用OpenGL ES
2.0渲染,而旧版gles11分支则使用OpenGL ES 1.1渲染。

支持iOS、Android、Windows Phone 8、Bada、BlackBerry、Marmalade、Windows、Linux等多个平台。支持C++、Lua、JavaScript编程语言。

5. android

GitHub Android App是
GitHub开源的Android客户端,支持Issues、Gists,并集成了新闻Feed,能够让你及时跟进组织及关注的开发者、库等。同时,该应
用还提供了一个用户快速访问你所创建、监控及发布issue的面板,可查看并将问题加入到收藏夹,可对标签、里程碑和任务进行过滤配置。

android资源库包含了GitHub Android App的所有源代码。

6. Android-ViewPagerIndicator

ViewPager指针项目,在使用ViewPager的时候能够指示ViewPager所在的位置,就像Google Play中切换的效果一样,还能使用在应用初始化的介绍页面。

兼容Android支持库的ViewPager及ActionBarSherlock,最初是基于Patrik Åkerfeldt的ViewFlow,开发者可以直接登陆Google Play下载该项目的演示应用。

7. MonoGame

MonoGame是一个Microsoft XNA 4.x Framework的开源跨平台实现。用于让XNA开发者将他们在Xbox
360、Windows & Windows Phone上开发的游戏移植到iOS、Android、Mac OS
X、Linux及Windows 8 Metro上,目前,PlayStation Mobile & Raspberry
PI的开发正在进行中。

详情请参考:MonoGame

8. Android-PullToRefresh

该项目用于为Android提供一个可重用的下拉刷新部件。它最初来源于Johan Nilsson的库(主要是图形、字符串和动画),但这些后来都已被取代。

9. android-async-http

android-async-http是Android上的一个异步、基于回调的HTTP客户端开发包,建立在Apache的HttpClient库上。

10. Android-Universal-Image-Loader

Android上最让人头疼的莫过于从网络获取图片、显示、回收,任何一个环节有问题都可能直接OOM,这个项目或许能帮到你。

Universal Image Loader for Android的目的是为了实现异步的网络图片加载、缓存及显示,支持多线程异步加载。它最初来源于Fedor Vlasov的项目,且自此之后,经过大规模的重构和改进。

11. GreenDroid

GreenDroid最初是由Cyril Mottier发起,是一个Android的UI开发类库,能够让UI开发更加简便,并且在应用中始终保持一致。

详情请参考:Cyril Mottier's Blog

12. Anki-Android

AnkiDroid是一个免费、开源的Android的闪存应用,可直接从Google Play进行下载。

详情请参考:ankidroid

13. android-actionbar

Action
bar是一个标识应用程序和用户位置的窗口功能,并且给用户提供操作和导航模式。在大多数的情况下,当开发者需要突出展现用户行为或在全局导航的
activity中使用action bar,因为action
bar能够使应用程序给用户提供一致的界面,且系统能够很好地根据不同的屏幕配置来适应操作栏的外观。

Action bar的主要目的:

提供一个用于识别应用程序的标示和用户的位置的专用空间。
在不同的应用程序之间提供一致的导航和视觉体验。
突出Activity的关键操作,并且在可预见的方法内给用户提供快捷的访问。

14. android-viewflow

android-viewflow是Android平台上的一个视图切换的效果库,ViewFlow相当于Android UI部件提供水平滚动的ViewGroup,使用Adapter进行条目绑定。

15. android-mapviewballoons

当使用Android地图外部库(com.google.android.maps)时,android-mapviewballoons会提供一个简单的方式来对地图覆盖进行标注,就是一个简单的信息气泡。

它由BalloonOverlayView组成,是一个代表显示你的MapView及BalloonItemizedOverlay的气泡的视图,BalloonItemizedOverlay是ItemizedOverlay的一个抽象扩展。

16. PushSharp

一个向iOS(iPhone/iPad APNS)、Android(C2DM和GCM)、Windows Phone和Windows 8设备发送推送通知的服务器端库。

17. androidannotations

Android Annotations是一个开源的框架,用于加速 Android应用的开发,可以让你把重点放在功能的实现上,简化了代码,提升了可维护性。

18. HockeyKit

Hockey是一个iOS Ad-Hoc自动更新框架。苹果App
Store中的所有App都可以使用它,它能够显着地提高Beta测试的整个过程,分为两部分:服务器和客户端框架。服务器组件需要所有脚本,但在没有客
户端库的情况下,也可以单独工作。它提供一个Web接口,Beta测试者可以使用它来安装最新的AdHoc配置文件,也可以直接在设备上通过Safari
安装最新的Beta版本。

只需在服务器上安装一次服务端,就可以处理包标识符不同的多个应用程序(有开发者强烈建议对Debug、AdHoc Beta和AppStore发布版使用不同的包标识符)。
默认当App启动或唤醒时,客户端会从服务器检测更新,用户可以在设置对话框中进行修改:一天一次或手动检查更新。
除了支持iOS,HokeyKit也支持Android平台,不过Android版还处在Alpha阶段,支持OTA及应用内更新。
为HockeyKit用户提供服务器托管服务。

19. android-menudrawer

Android上的菜单展示风格各异,其中用得最多且体验最好的莫过于左右滑动来显示隐藏的菜单,android-menudrawer是一个滑动
式菜单实现,允许用户在应用当中实现无缝导航。该项目具有多种菜单展示效果,其中最常见的就是通过屏幕边缘拖动或点击动作栏的“向上”按钮显示。

实现功能:

菜单可以沿着四个边放置。
支持附加一个始终可见、不可拖动的菜单。
菜单的内容和整个窗口都可以隐藏。
可用于XML布局。
显示当前可见屏幕的指示器。

20. android-flip

Aphid FlipView是一个能够实现Flipboard翻页效果的UI组件。

G. android.support.v4.view.pagertabstrip什么意思

PagerTabStrip这个控件现在很少使用了,现在都是使用viewpager+tablayout,下面是这两个配合的效果:

android学习手册包含9个章节,108个例子,源码文档随便看,例子都是可交互,可运行,源码采用android studio目录结构,高亮显示代码,文档都采用文档结构图显示,可以快速定位。360手机助手中下载

PagerTabStrip是ViewPager的一个关于当前页面、上一个页面和下一个页面的一个非交互的指示器。它经常作为ViewPager控件的一个子控件被被添加在XML布局文件中。在你的布局文件中,将它作为子控件添加在ViewPager中。而且要将它的 android:layout_gravity 属性设置为TOP或BOTTOM来将它显示在ViewPager的顶部或底部。每个页面的标题是通过适配器的getPageTitle(int)函数提供给ViewPager的。

1、XML布局文件:


[html] view plain print?

<RelativeLayoutxmlns: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"

tools:context="com.example.testviewpage_2.MainActivity">

<android.support.v4.view.ViewPager

android:id="@+id/viewpager"

android:layout_width="wrap_content"

android:layout_height="200dip"

android:layout_gravity="center">

<android.support.v4.view.PagerTitleStrip

android:id="@+id/pagertitle"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_gravity="top"

/>

</android.support.v4.view.ViewPager>

</RelativeLayout>

<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"
tools:context="com.example.testviewpage_2.MainActivity" >

<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="wrap_content"
android:layout_height="200dip"
android:layout_gravity="center">

<android.support.v4.view.PagerTitleStrip
android:id="@+id/pagertitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top"
/>

</android.support.v4.view.ViewPager>

</RelativeLayout>

清楚的看到我们将.PagerTitleStrip将其作为ViewPager的子控件直接嵌入其中;这是第一步;当然android:layout_gravity=""的值要设置为top或bottom。将标题栏显示在顶部或底部。



2、重写适配器的getPageTitle()函数

便于大家有个整体认识,先贴全局代码,然后再逐个讲,这段代码是在《ViewPager 详解(二)---详解四大函数》直接更改来的,如果不太明白,先看看这篇文章。



[java] view plain print?

packagecom.example.testviewpage_2;

/**

*@authorharvic

*@date2014.8.12

*/

importjava.util.ArrayList;

importjava.util.List;

importandroid.app.Activity;

importandroid.os.Bundle;

importandroid.support.v4.view.PagerAdapter;

importandroid.support.v4.view.PagerTitleStrip;

importandroid.support.v4.view.ViewPager;

importandroid.view.LayoutInflater;

importandroid.view.View;

importandroid.view.ViewGroup;

{

privateViewview1,view2,view3;

privateList<View>viewList;//view数组

privateViewPagerviewPager;//对应的viewPager

privateList<String>titleList;//标题列表数组

@Override

protectedvoidonCreate(BundlesavedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

viewPager=(ViewPager)findViewById(R.id.viewpager);

LayoutInflaterinflater=getLayoutInflater();

view1=inflater.inflate(R.layout.layout1,null);

view2=inflater.inflate(R.layout.layout2,null);

view3=inflater.inflate(R.layout.layout3,null);

viewList=newArrayList<View>();//将要分页显示的View装入数组中

viewList.add(view1);

viewList.add(view2);

viewList.add(view3);

titleList=newArrayList<String>();//每个页面的Title数据

titleList.add("王鹏");

titleList.add("姜语");

titleList.add("结婚");

PagerAdapterpagerAdapter=newPagerAdapter(){

@Override

publicbooleanisViewFromObject(Viewarg0,Objectarg1){

//TODOAuto-generatedmethodstub

//根据传来的key,找到view,判断与传来的参数Viewarg0是不是同一个视图

returnarg0==viewList.get((int)Integer.parseInt(arg1.toString()));

}

@Override

publicintgetCount(){

//TODOAuto-generatedmethodstub

returnviewList.size();

}

@Override

publicvoiddestroyItem(ViewGroupcontainer,intposition,

Objectobject){

//TODOAuto-generatedmethodstub

container.removeView(viewList.get(position));

}

@Override

publicObjectinstantiateItem(ViewGroupcontainer,intposition){

//TODOAuto-generatedmethodstub

container.addView(viewList.get(position));

//把当前新增视图的位置(position)作为Key传过去

returnposition;

}

@Override

(intposition){

//TODOAuto-generatedmethodstub

returntitleList.get(position);

}

};

viewPager.setAdapter(pagerAdapter);

}

}

H. android studio 怎样导入 ViewPagerIndicator

AndroidViewpagerIndicator是Android开发中最常用的控件之一,几乎所有的新闻类APP中都有使用,下面介绍其基本使用方法。1.ViewPagerIndicator的Library查看ViewpagerIndicator的Library代码,可以看到此项目的设计思想:首先定义了一个PageIndicator接口,它里面定义了最重要和基本的indicator表现出的一些方法:1.1首先一个indicator必须要与一个ViewPager关联在一起,所以它提供了一个setViewPager方法。1.2它扩展了ViewPager.OnPageChangeListener接口,表示接管了ViewPager的Pager改变时的监听处理,这也是为什么为ViewPager设置OnPageChangeListener监听器时不能设置在ViewPager上而必须设置在indicator上的原因。1.3还有一个notifyDataSetChanged通知方法,表示为这个ViewPager提供View(一般是Fragment)的Adapter里面的数据集发生变化时,执行的动作,这里可增加相关的逻辑。2.ViewpagerIndicator的实现类然后再看下ViewpagerIndicator的实现类,共有6个,由6个类分别实现,它们分别为:2.1小圆圈类型的2.2带图标类型的2.3小横线类型的,距离屏幕最下边端有一定的距离。2.4标签类型的(Tab)2.5标题类型的,与标签类型的有点像,但它当前的标题页的左/右边的标题会卷起,即往两端缩进去。2.6屏幕底部小横线类型的,并且会占满整行。3.ViewpagerIndicator随附带的Demo3.1Demo项目的设计项目由一个ListSamples的ListActivity入口,它主要用作组装所有的子indicator的列表。TestFragment.java,所有ViewPager上真正显示的视图。TestFragmentAdapter.java,所有ViewPager里的Adapter,为ViewPager生成TestFragment。Samplexxx.java,所有的indicator的显示,一个类显示一种使用方法或特性。3.2具体使用方法查看SampleCirclesDefault.java基本就可以明白它的基本使用方法:首先,把Indicator包含进xml文件中,如下,注意它应该紧邻在ViewPager的上方或下方,总之要挨在一起。?1234其次,使用titleIndicator.setViewPager(pager)把两者绑定在一起,如下所示:?1234567//=(ViewPager)findViewById(R.id.pager);pager.setAdapter(newTestAdapter(getSupportFragmentManager()));//=(TitlePageIndicator)findViewById(R.id.titles);titleIndicator.setViewPager(pager);最后,如果你要监听ViewPager中包含的Fragment的改变(手滑动切换了页面),使用OnPageChangeListener为它指定一个监听器,那么不能直接设置在ViewPager上,而要设置在Indicator上,如下所示:?12//.setOnPageChangeListener(mPageChangeListener);4.修改indicator的样式(Theme)4.1ThemeXML,在AndroidManifest.xml中相应的Activity中设置,比如:?123456789android:theme="@style/StyledIndicators"==>values/styles.xml中相应部分为:?12345678@style/CustomCirclePageIndicator@style/CustomLinePageIndicator@style/CustomTitlePageIndicator@style/CustomTabPageIndicator@style/CustomUnderlinePageIndicator4.2LayoutXML,在LayoutXML方法中指定,如下:?1234567891011121314151617184.3Objectmethods,直接在代码中设置,如下:?=(CirclePageIndicator)findViewById(R.id.indicator);mIndicator=indicator;indicator.setViewPager(mPager);finalfloatdensity=getResources().getDisplayMetrics().density;indicator.setBackgroundColor(0xFFCCCCCC);indicator.setRadius(10*density);indicator.setPageColor(0x880000FF);indicator.setFillColor(0xFF888888);indicator.setStrokeColor(0xFF000000);indicator.setStrokeWidth(2*density);具体有哪些属性可以参考library项目中的vpi__attrs.xml文件。

I. viewpager-SlidingPaneLayout跟Viewpager发生冲突怎么解决

ViewPager 和 SlidingPaneLayout都可以左右的滑动.

上面文章中说要修改v4包里的SlidingPaneLayout的源码,首先要找到它,如果没有直接连接到这个源码的,是看不到的.可以再Android sdk-->extras-->android-->support-->v4-->src-->java-->android->support-->v4-->widget文件里面找到

1.首先修改 onInterceptTouchEvent 中的 ACTION_MOVE动作里面的代码,在if判断中添加一个或的判断,就是下面的红色代码部分

if (adx > slop && ady > adx<span style="color:#ff0000;"> || canScroll(this, false, Math.round(x - mInitialMotionX), Math.round(x), Math.round(y))</span>) {

2.找到canScroll方法.修改他的返回值,返回值修改为红色部分,其中方法是没有的,需要手动的添加

return <span style="color:#ff0000;">check www.hnne.com V && (ViewCompat.canScrollHorizontally(v, -dx) || ((v instanceof ViewPager) && ((ViewPager) v, -dx)));

3.添加方法

boolean (ViewPager p, int dx) {
return !(dx < 0 && p.getCurrentItem() <= 0 || 0 < dx && p.getAdapter().getCount() - 1 <= p.getCurrentItem());
}

上面的操作修改完成之后就可以了,记得修改xml文件里面的路径

J. viewpager不用导入v4包怎么用

用不了! 现在新建的android项目,默认就会带v4包的,所以你不需要去关心了

阅读全文

与viewpager2源码相关的资料

热点内容
口才训练手册编译口才精品书系 浏览:995
linuxfunc 浏览:266
高德地图解压后的文件 浏览:636
php加水印类 浏览:225
编译原理定义表格和编写查找函数 浏览:349
指数函数和对数函数的高精度快速算法 浏览:207
c预编译干什么 浏览:24
hp网络共享文件夹 浏览:365
程序员如何不被废 浏览:806
二进制流转pdf 浏览:916
php判断爬虫 浏览:571
960除24除4简便算法 浏览:786
关于解压英语翻译 浏览:565
python控制键盘右键 浏览:921
php没有libmysqldll 浏览:829
时政新闻app哪个好 浏览:906
手机已加密怎么办 浏览:201
安卓手机截屏怎么传到苹果 浏览:529
京管家app哪里下载 浏览:33
文件夹横向排列的竖向排列 浏览:454