Android 응용 프로그램 에서 ViewPager 를 사용 하여 QQ 와 유사 한 인터페이스 전환 효 과 를 실현 합 니 다.
ViewPager 는 android-sdk 에 추가 되 었 습 니 다.구체 적 인 위 치 는%android 입 니 다.sdk_home%\android-compatibility\v4,%android_sdk_홈%는 안 드 로 이 드-sdk-windows 디 렉 터 리 입 니 다.
자,다음 효과 도 를 놓 겠 습 니 다.
단계 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 를 찾 아 업데이트 하면 된다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Android ViewPager로 무한 스크롤 가능조금 조사해 보았더니, 라고 하는 기사가 돈피샤였습니다. 영어 기사라고 하는 것과, 데이터의 갱신에 대해서는 접하고 있지 않다(조금 유스 케이스가 다르다), 라고 하는 것으로 여기에 정리해 보겠습니다. ViewPag...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.