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 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.