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包的,所以你不需要去關心了