導航:首頁 > 源碼編譯 > 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源碼相關的資料

熱點內容
程序員接私活初級 瀏覽:431
全無油潤滑壓縮機 瀏覽:183
代碼加密常用方法 瀏覽:952
安卓手機如何解除已禁用 瀏覽:396
演算法的隨機性 瀏覽:485
高中解壓體育游戲 瀏覽:533
androidstudior丟失 瀏覽:345
命令行筆記 瀏覽:737
360目標文件夾訪問拒絕 瀏覽:518
3b編程加工指令 瀏覽:789
c8051f系列單片機選型手冊 瀏覽:772
南昌php程序員 瀏覽:512
bcs命令 瀏覽:446
如何在伺服器指向域名 瀏覽:417
車床編程可以做刀嗎 瀏覽:519
ln命令源碼 瀏覽:792
用粘液做解壓手套 瀏覽:331
icloud收信伺服器地址 瀏覽:500
編程思考者 瀏覽:453
壓縮機型號用什麼氟利昂 瀏覽:553