我正在为 ViewPager 使用折旧代码。想更新但是只能找到片段教程
I am using depreciated code for ViewPager. I want to update it but can only find fragment tutorials
我在 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 实现
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);
}
除了覆盖已弃用的方法之外,instantiateItem()
还应该实例化 一个项目。这就是 "instantiate" 这个词出现在方法名称中的原因。您不是在实例化一个项目,而是在尝试使用其他东西拥有的现有小部件,这违反了 PagerAdapter
合同并且随着时间的推移不太可能可靠。
因此,您的 instantiateItem()
方法应该使用 LayoutInflater
(通过 Activity
上的 getLayoutInflater()
)到 inflate()
布局,或者构建适当的布局UI 用于 Java 代码中的页面。它需要将新 UI 作为 ViewGroup
的子 View
添加到 instantiateItem()
的非弃用版本中。
例如,这里有一个 activity 有一个 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);
}
}
}
(来自 this sample project)
在instantiateItem(ViewGroup, int)
中,我膨胀一个布局,自定义内容,然后手动将View
添加到container
。事实上,我可能可以将 true
作为第三个参数传递给 inflate()
方法并跳过额外的 addView()
调用,尽管我还没有尝试过。
我在 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 实现
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);
}
除了覆盖已弃用的方法之外,instantiateItem()
还应该实例化 一个项目。这就是 "instantiate" 这个词出现在方法名称中的原因。您不是在实例化一个项目,而是在尝试使用其他东西拥有的现有小部件,这违反了 PagerAdapter
合同并且随着时间的推移不太可能可靠。
因此,您的 instantiateItem()
方法应该使用 LayoutInflater
(通过 Activity
上的 getLayoutInflater()
)到 inflate()
布局,或者构建适当的布局UI 用于 Java 代码中的页面。它需要将新 UI 作为 ViewGroup
的子 View
添加到 instantiateItem()
的非弃用版本中。
例如,这里有一个 activity 有一个 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);
}
}
}
(来自 this sample project)
在instantiateItem(ViewGroup, int)
中,我膨胀一个布局,自定义内容,然后手动将View
添加到container
。事实上,我可能可以将 true
作为第三个参数传递给 inflate()
方法并跳过额外的 addView()
调用,尽管我还没有尝试过。