Android:水平视图寻呼机不在主屏幕上
Posted
技术标签:
【中文标题】Android:水平视图寻呼机不在主屏幕上【英文标题】:Android: Horizontal View Pager not on the main screen 【发布时间】:2012-08-24 07:52:13 【问题描述】:我最近再次开始为 android 编程,目前正在开发一个应用程序,我想实现水平视图寻呼机,以便用户在一个实例中可以在两个页面之间滑动以输入/更新信息,并在稍后的实例中滑动在四个页面之间查看他们输入/更新的信息。我基本上是在为角色扮演游戏制作电子角色表。
我一直在研究这些水平视图寻呼机的教程: http://mobile.tutsplus.com/tutorials/android/android-user-interface-design-horizontal-view-paging/
http://manishkpr.webheavens.com/android-viewpager-example/
我的问题是我看过的所有教程,h。视图寻呼机是在主活动屏幕上使用的,有没有办法在后续屏幕上实现水平视图寻呼机?每次我试图实现代码以在主屏幕以外的页面上工作时,它一到该页面就崩溃了。
那么,长话短说,有没有人在非主页上成功实现了水平视图寻呼机,如果是,如何实现?
我希望我说得有道理,但如果您还有任何问题,请告诉我!
08-24 01:44:34.310: I/ActivityManager(144): 从 pid 15115 开始 cmp=com.echaractersheet/.CharacterStats1 08-24 01:44:34.360: D/AndroidRuntime(15115): 关闭 VM 08-24 01:44:34.360: W/dalvikvm(15115): threadid=1: 线程以未捕获的异常退出 (group=0x40a581f8) 08-24 01:44:34.370:E/AndroidRuntime(15115):致命异常:主要 08-24 01:44:34.370: E/AndroidRuntime(15115): java.lang.RuntimeException: 无法启动活动 ComponentInfocom.echaractersheet/com.echaractersheet.CharacterStats1: java.lang.NullPointerException
characterstats.xml:
<android.support.v4.view.ViewPager
android:layout_
android:layout_
android:id="@+id/characterstatspager" />
characterstats1.xml 和 characterstats2.xml 是我想在它们之间滑动的两个页面
CharacterStatsPagerAdapter.java: ...
public class CharacterStatsPagerAdapter extends PagerAdapter
public int getCount()
return 2;
public Object instantiateItem(View collection, int position)
LayoutInflater inflater = (LayoutInflater) collection.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
int resId =0;
switch (position)
case 0:
resId = R.layout.characterstats1;
break;
case 1:
resId = R.layout.characterstats2;
break;
View view = inflater.inflate(resId, null);
((ViewPager) collection).addView(view, 0);
return view;
@Override
public void destroyItem(View arg0, int arg1, Object arg2)
((ViewPager) arg0).removeView((View) arg2);
@Override
public boolean isViewFromObject(View arg0, Object arg1)
return arg0 == ((View) arg1);
@Override
public Parcelable saveState()
return null;
CharacterStats1.java:
CharacterStatsPagerAdapter adapter = new CharacterStatsPagerAdapter();
ViewPager myPager = (ViewPager) findViewById(R.id.characterstatspager);
myPager.setAdapter(adapter);
myPager.setCurrentItem(0);
【问题讨论】:
你叫什么“主页”。你能告诉我们你的确切错误吗? 我有我的 activity_main.java 和 activity_main.xml。崩溃时我没有运行 logcat,所以我不确定错误。但是从activity_main.java 用户被带到characterstats.java/characterstats.xml,此时我希望用户能够滑动到第二页。抱歉,我没有让它更清晰的代码,我已经建立并销毁了很多次。 没有代码很难为您提供解决方案,但就我而言,按照您描述的方式实现 viewpager 从来没有任何困难。 好的,谢谢,至少我知道这是可能的。我将开始修改我所拥有的,并尽快发布一些代码。再次感谢您。 查看这个例子github.com/amitkot/view-pager-sample 【参考方案1】:寻呼机将使用适配器中的数据,因此只要将对象保留在适配器中,就可以了。所以也许在进入下一个屏幕之前,您应该将对象保存在适配器中(可能保存到另一个类中的静态字段,只是一会儿),当您进入新页面时,您可以检索对象并将它们放入适配器中新的 viewpager 并添加新页面。这就是我将在你的情况下做的事情。
更新:
这只是一个例子,这需要更多的代码行,但这是一个好的开始。
public class Fields
private String name;
private String lastName;
private int age;
private boolean male;
public Fields()
this.name = "";
this.lastName = "";
public Fields(String name, String lastName, int age, boolean male)
this.name = name;
this.lastName = lastName;
this.age = age;
this.male = male;
public View getRepresentation(Context mContext)
/*Create the view that ViewPager will display*/
LinearLayout layout = new LinearLayout(mContext);
layout.addView(new TextView(mContext)); //Name
layout.addView(new TextView(mContext)); //LastName
layout.addView(new TextView(mContext)); //Age
layout.addView(new CheckBox(mContext)); //Male/Female
return layout;
View Pager 适配器
public class ViewPagerAdapter extends PagerAdapter
private List<Fields> pages;
private Context mContext;
public ViewPagerAdapter( Context mContext )
this.mContext = mContext;
public void setPages(List<Fields> pages)
this.pages = pages;
public List<Fields> getPages()
return this.pages;
@Override
public int getItemPosition(Object object)
return POSITION_NONE;
@Override
public int getCount()
return pages.size();
@Override
public Object instantiateItem( View pager, int position )
View view = pages.get(position).getRepresentation(mContext);
view.setId(position);
return view;
@Override
public void destroyItem( View pager, int position, Object view )
((ViewPager)pager).removeViewInLayout( (View) view );
@Override
public boolean isViewFromObject( View view, Object object )
return view.equals( object );
主类
public class MainActivity extends Activity
private Context mContext;
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
this.mContext = getApplicationContext();
setContentView(R.layout.viewpager_layout);
final List<Fields> fields = new ArrayList<Fields>();
fields.add(new Fields());
ViewPager mPager = (ViewPager) this.findViewById(R.id.viewpager);
Button nextActivity = (Button) this.findViewById(R.id.nextAct);
ViewPagerAdapter mAdapter = new ViewPagerAdapter(mContext);
mAdapter.setPages(fields);
mPager.setAdapter(mAdapter);
nextActivity.setOnClickListener(new OnClickListener()
@Override
public void onClick(View v)
SecondActivity.pages = fields;
Intent intent = new Intent(mContext, SecondActivity.class);
startActivity(intent);
);
@Override
public boolean onCreateOptionsMenu(Menu menu)
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
二等
public class SecondActivity extends Activity
public static List<Fields> pages;
private Context mContext;
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
this.mContext = getApplicationContext();
setContentView(R.layout.viewpager_layout);
final List<Fields> fields = pages;
pages = null;
fields.add(new Fields()); //Add the new Pages
ViewPager mPager = (ViewPager) this.findViewById(R.id.viewpager);
Button nextActivity = (Button) this.findViewById(R.id.nextAct);
ViewPagerAdapter mAdapter = new ViewPagerAdapter(mContext);
mAdapter.setPages(fields);
mPager.setAdapter(mAdapter);
nextActivity.setVisibility(View.GONE);
@Override
public boolean onCreateOptionsMenu(Menu menu)
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
正如我所说,这只是一个示例,应该为您的对象更改字段类,ViewPagerAdapter 是您保存将传递给下一个活动的页面列表的地方。 而第二个活动上的静态场只是用作活动和活动之间的桥梁 不应该过度使用,这就是为什么在获取数据后你需要设置为 NULL 才能知道你 已经抓住了价值。希望对您有所帮助。
注意:此代码无法正常工作,需要更多代码。
【讨论】:
谢谢您,我很好奇,您将如何实施上述内容? 非常感谢,这超出了我的预期,将是非常宝贵的资源! 欢迎您,如果这有助于您解决最初的问题,请将其标记为答案以供其他人查看。祝你有美好的一天。以上是关于Android:水平视图寻呼机不在主屏幕上的主要内容,如果未能解决你的问题,请参考以下文章