Android 응용 프로그램 에서 ViewPager 를 사용 하여 QQ 와 유사 한 인터페이스 전환 효 과 를 실현 합 니 다.

10424 단어 ViewPagerAndroid
요 며칠 동안 ViewPager 를 연구 하고 있 습 니 다.ViewPager 를 사용 하여 QQ 와 유사 한'최근 연락처,친구,그룹'의 인터페이스 전환 을 어떻게 실현 하 는 지 간단하게 쓰 십시오.(그들 이 이 방법 으로 이 루어 졌 는 지 모 르 겠 습 니 다.)
ViewPager 는 android-sdk 에 추가 되 었 습 니 다.구체 적 인 위 치 는%android 입 니 다.sdk_home%\android-compatibility\v4,%android_sdk_홈%는 안 드 로 이 드-sdk-windows 디 렉 터 리 입 니 다.
자,다음 효과 도 를 놓 겠 습 니 다.
2016323104647071.png (480×800)
단계 1:새 프로젝트 를 만 듭 니 다.저 는 Viewpager 입 니 다.
STEP 2:jar 패키지 가 져 오기
구체 적 으로 다음 과 같다.
오른쪽 단 추 를 누 르 면 프로젝트--Properties--왼쪽 Java Build Path--오른쪽 Libraries 탭-오른쪽 을 누 르 면 External Jars--위 에서 설명 한 위 치 를 선택 한 jar 가방 을 선택 하여 저장 합 니 다.
STEP 3:메 인 화면 을 만 들 고 android.support.v4.view.ViewPager 구성 요 소 를 추가 합 니 다.

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  android:layout_width="fill_parent" 
  android:layout_height="fill_parent" 
  android:orientation="vertical" > 
 
  <TextView 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/hello" /> 
   
   
  <android.support.v4.view.ViewPager 
    android:id="@+id/mViewPager" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    /> 
 
   
</LinearLayout> 

STEP 4:추가 할 인터페이스 세 개 작성
화면 이 모두 간단 해서 마음대로 썼 다.
인터페이스 1

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  android:layout_width="fill_parent" 
  android:layout_height="fill_parent" 
  android:background="#ff0000" 
  android:orientation="vertical" > 
 
  <Button 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="layout1" /> 
 
</LinearLayout> 

인터페이스 2

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  android:layout_width="fill_parent" 
  android:layout_height="fill_parent" 
  android:background="#00ff00" 
  android:orientation="vertical" > 
 
  <TextView 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="layout2" /> 
 
</LinearLayout>
 
인터페이스 3

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  android:layout_width="fill_parent" 
  android:layout_height="fill_parent" 
  android:background="#0000ff" 
  android:orientation="vertical" > 
 
  <TextView 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="layout3" /> 
 
</LinearLayout> 

STEP 5:주 클래스 를 작성 합 니 다.제 이름 은 Viewpager Activity 입 니 다.

package com.carter.viewpager; 
 
import java.util.ArrayList; 
import java.util.List; 
import java.util.zip.Inflater; 
 
import android.app.Activity; 
import android.app.ActivityGroup; 
import android.content.Intent; 
import android.os.Bundle; 
import android.support.v4.view.PagerAdapter; 
import android.support.v4.view.ViewPager; 
import android.support.v4.view.ViewPager.OnPageChangeListener; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
 
public class ViewpagerActivity extends ActivityGroup { 
   
  /** 
   *           
   */ 
  ViewPager mViewPager; 
   
  /** 
   * ViewPager      Adapter        , 
   *  Adapter   PagerAdapter 
   */ 
  MyPagerAdapter adapter; 
   
  /** 
   *          
   */ 
  List<View> list;  
   
  /** 
   *        
   */ 
  LayoutInflater mInflater; 
   
   
   
   
  /** Called when the activity is first created. */ 
  @Override 
  public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
     
    mInflater = this.getLayoutInflater(); 
     
    /** 
     *          List,     PagerAdapter 
     */ 
    list = new ArrayList<View>(); 
    list.add(this.getLocalActivityManager().startActivity("layout1", new Intent(ViewpagerActivity.this, Layout1Activity.class)).getDecorView()); 
    list.add(mInflater.inflate(R.layout.layout2, null)); 
    list.add(mInflater.inflate(R.layout.layout3, null)); 
     
    mViewPager = (ViewPager)findViewById(R.id.mViewPager); 
    adapter = new MyPagerAdapter(list); 
    mViewPager.setAdapter(adapter); 
     
    /** 
     *  ViewPager  PageChangeListener,                ,                ,          
     */ 
    mViewPager.setOnPageChangeListener(new OnPageChangeListener() { 
       
      @Override 
      public void onPageSelected(int arg0) { 
        // TODO Auto-generated method stub 
        Log.i("carter", "onPageSelected"); 
      } 
       
      @Override 
      public void onPageScrolled(int arg0, float arg1, int arg2) { 
        // TODO Auto-generated method stub 
         
      } 
       
      @Override 
      public void onPageScrollStateChanged(int arg0) { 
        // TODO Auto-generated method stub 
         
      } 
    }); 
     
  } 
   
   
   
   
  class MyPagerAdapter extends PagerAdapter 
  { 
    List<View> mList; 
     
    public MyPagerAdapter(List<View> list){ 
      mList = list; 
    } 
 
    @Override 
    public int getCount() { 
      // TODO Auto-generated method stub 
      return mList.size(); 
    } 
 
    @Override 
    public boolean isViewFromObject(View arg0, Object arg1) { 
      // TODO Auto-generated method stub 
      return arg0 == (arg1); 
    } 
 
    @Override 
    public void destroyItem(View container, int position, Object object) { 
      // TODO Auto-generated method stub 
      ((ViewPager)container).removeView(mList.get(position)); 
    } 
 
    @Override 
    public Object instantiateItem(View container, int position) { 
      // TODO Auto-generated method stub 
      ((ViewPager)container).addView(mList.get(position), 0); 
      return mList.get(position); 
    }     
 
    @Override 
    public void finishUpdate(ViewGroup container) { 
      // TODO Auto-generated method stub 
      super.finishUpdate(container); 
    } 
  } 
} 

코드 판독:
1.위 에 PagerAdapter 를 다시 썼 는데 그 중에서 가장 중요 한 방법 은

@Override 
    public Object instantiateItem(View container, int position) { 
      // TODO Auto-generated method stub 
      ((ViewPager)container).addView(mList.get(position), 0); 
      return mList.get(position); 
    }  
구체 적 으로 왜 매번 addView 에서 0 까지 의 위치 인지 아직 모 르 겠 습 니 다.이것 도 인터넷 에서 방법 을 찾 아 보 았 습 니 다.
2.List 를 초기 화 할 때 안에 포 함 된 내용 은 하나의 View 요소 이 고 제 가 아 는 범위 안에 두 가지 방법 이 있 습 니 다.
첫 번 째 는 Window 의 getDecorView()를 추가 하여 View 를 얻 는 것 입 니 다.
두 번 째 는 LayoutInflater 를 통 해 xml 에서 View 를 생 성 하 는 것 이다.
주의해 야 할 것 은 첫 번 째 방법 은 Activity Group 에서 주 클래스 를 계승 해 야 추가 할 때 getLocalActivity Manager 와 그 후의 방법 을 사용 할 수 있 습 니 다.예 를 들 어 이 사례 의 Layout1activity 는 AndroidManifest.xml 에서 설명 해 야 합 니 다.

/** 
 *          List,     PagerAdapter 
 */ 
list = new ArrayList<View>(); 
list.add(this.getLocalActivityManager().startActivity("layout1", new Intent(ViewpagerActivity.this, Layout1Activity.class)).getDecorView()); 
list.add(mInflater.inflate(R.layout.layout2, null)); 
list.add(mInflater.inflate(R.layout.layout3, null)); 

3.xml 에서 View 를 생 성하 여 추가 하면 계승 Activity Group 을 완전히 제거 할 수 있 습 니 다.
4.startActivity 의 방법 으로 시작 하면 추가 해 야 할 몇 가지 Activity 는 함께 가입 할 때 초기 화 되 고 onCreate()방법 에서 LOG 를 쳐 서 알 수 있 습 니 다.
PS:Android 에서 ViewPager 와 PagerAdapter 에서 notifyDataSetChanged 를 호출 하여 실 효 된 문 제 를 어떻게 해결 합 니까?
구체 적 인 설명 은 다음 과 같다.
구 글 이 안 드 로 이 드 3.0SDK 에서 출시 한 뷰 페 어 컨트롤 은 개발 자 들 이 개발 한 페이지 좌우 이동 전환 기능 을 상당 부분 만족 시 켜 사용 하기에 매우 편리 하 다.그러나 데 이 터 를 삭제 하거나 수정 할 때 PagerAdapter 는 BaseAdapter 처럼 notifyDataSetChanged 방법 으로 만 View 새로 고침 을 알 릴 수 없습니다.
가장 기본 적 인 방법:
child view 가 비교적 간단 한 경우(예 를 들 어 TextView,ImageView 등 만 있 고 ListView 등 보 여 주 는 데이터 가 없 는 경우)에 대해 자신의 Adapter 에 코드 를 추가 할 수 있 습 니 다.

@Override  
public int getItemPosition(Object object) {  
  return POSITION_NONE;  
}  
이렇게 하면 일반적인 상황 에서 요구 하 는 효과 에 도달 할 수 있다.
존재 하 는 문제:
PagerAdapter 의 Bug 가 아 닙 니 다.일반적인 상황 에서 notifyDataSetChanged 방법 을 호출 하면 ViewPager 가 Adapter 의 getItemPosition 방법 으로 모든 child view 를 조회 할 수 있 습 니 다.이 경우 모든 child view 위 치 는 POSITION 입 니 다.NONE 는 모든 child view 가 존재 하지 않 는 다 는 것 을 의미 합 니 다.ViewPager 는 destroy Item 방법 을 사용 하여 소각 하고 다시 생 성 하 며 시스템 비용 을 늘 리 고 복잡 한 상황 에서 논리 적 문 제 를 야기 합 니 다.특히 child view 콘 텐 츠 를 업데이트 하고 싶 을 때 전혀 불필요 한 비용 이 들 었 다.
더욱 효과 적 인 방법:
더욱 확실한 방법 은 지역 에 따라 적당 한 조 치 를 취하 고 자신의 수요 에 따라 notifyDataSetChanged 기능 을 실현 하 는 것 이다.예 를 들 어 특정한 View 내용 만 업데이트 해 야 할 때 인 스 턴 트 Item()에 View.setTag 방법 으로 로 고 를 추가 하고 정 보 를 업데이트 해 야 할 때 findView With Tag 방법 으로 해당 하 는 View 를 찾 아 업데이트 하면 된다.

좋은 웹페이지 즐겨찾기