我在ViewPager中使用布局,因为我不需要片段。如何使用布局实现ViewPager?我正在使用pagerslidingtabstrip库,但我不相信这应该是一个问题。如果您需要更多代码或问题,我可以更新我的问题。我删除了大部分布局,使其变得简单。
这是我的旧代码。
instantiateItem() is depreciated.
适配器
class HomePagerAdapter extends PagerAdapter {
@Override
public CharSequence getPageTitle(int position) {
int resId = 0;
switch (position) {
case 0:
resId = R.id.home_layout;
return "Projects";
case 1:
resId = R.id.home_projects;
return "Schedule";
}
return getPageTitle(position);
}
/*
Depreciated, need to find out what is going to be replacing the depreciated statement
*/
public Object instantiateItem(View collection, int position) {
int resId = 0;
switch (position) {
case 0:
resId = R.id.home_layout;
break;
case 1:
resId = R.id.home_projects;
break;
}
return findViewById(resId);
}
@Override
public int getCount() {
return 2;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == (arg1);
}
}
ViewPager Implementaton
ViewPager pager;
HomePagerAdapter pgAdapter;
PagerSlidingTabStrip homePTS;
private void viewPager() {
pager = (ViewPager) findViewById(R.id.pager);
pgAdapter = new HomePagerAdapter();
pager.setAdapter(pgAdapter);
homePTS = (PagerSlidingTabStrip) findViewById(R.id.tabs);
homePTS.setViewPager(pager);
}
布局
<android.support.v4.view.ViewPager
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_below="@+id/tabs"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:id="@+id/home_layout">
</LinearLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/home_projects">
</RelativeLayout>
</android.support.v4.view.ViewPager>
更新
// Changed View to ViewGroup. It Worked but not sure if it the proper way to do it?
public Object instantiateItem(ViewGoup collection, int position) {
int resId = 0;
switch (position) {
case 0:
resId = R.id.home_layout;
break;
case 1:
resId = R.id.home_projects;
break;
}
return findViewById(resId);
}
答案 0 :(得分:3)
除了覆盖已弃用的方法之外,instantiateItem()
应该实例化项目。这就是为什么单词“instantiate”在方法名称中。您没有实例化某个项目,而是尝试使用其他东西拥有的现有窗口小部件,这会破坏PagerAdapter
合同,并且随着时间的推移不太可靠。
因此,您的instantiateItem()
方法应该使用LayoutInflater
(通过getLayoutInflater()
上的Activity
)到inflate()
布局,或构建适当的用户界面Java代码中的页面。它需要将新的用户界面作为View
的子ViewGroup
添加到instantiateItem()
的非弃用版本中。
例如,以下活动的ViewPager
基于View
PagerAdapter
:
/***
Copyright (c) 2012 CommonsWare, LLC
Licensed under the Apache License, Version 2.0 (the "License"); you may not
use this file except in compliance with the License. You may obtain a copy
of the License at http://www.apache.org/licenses/LICENSE-2.0. Unless required
by applicable law or agreed to in writing, software distributed under the
License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
OF ANY KIND, either express or implied. See the License for the specific
language governing permissions and limitations under the License.
From _The Busy Coder's Guide to Android Development_
http://commonsware.com/Android
*/
package com.commonsware.android.mvp1;
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity {
private ViewPager pager=null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
pager=(ViewPager)findViewById(R.id.pager);
pager.setAdapter(new SampleAdapter());
pager.setOffscreenPageLimit(6);
}
/*
* Inspired by
* https://gist.github.com/8cbe094bb7a783e37ad1
*/
private class SampleAdapter extends PagerAdapter {
@Override
public Object instantiateItem(ViewGroup container, int position) {
View page=
getLayoutInflater().inflate(R.layout.page, container, false);
TextView tv=(TextView)page.findViewById(R.id.text);
int blue=position * 25;
final String msg=
String.format(getString(R.string.item), position + 1);
tv.setText(msg);
tv.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this, msg, Toast.LENGTH_LONG)
.show();
}
});
page.setBackgroundColor(Color.argb(255, 0, 0, blue));
container.addView(page);
return(page);
}
@Override
public void destroyItem(ViewGroup container, int position,
Object object) {
container.removeView((View)object);
}
@Override
public int getCount() {
return(9);
}
@Override
public float getPageWidth(int position) {
return(0.5f);
}
@Override
public boolean isViewFromObject(View view, Object object) {
return(view == object);
}
}
}
在instantiateItem(ViewGroup, int)
中,我会对布局进行充气,自定义内容,然后手动将View
添加到container
。事实上,我可以将true
作为第三个参数传递给inflate()
方法并跳过额外的addView()
调用,但我还没有尝试过。