0

我最近再次开始为 android 编程,目前正在开发一个应用程序,我想实现水平视图寻呼机,以便用户在一个实例中可以在两个页面之间滑动以输入/更新信息,然后在四个页面之间滑动查看他们输入/更新的信息。我基本上是在为角色扮演游戏制作电子角色表。

我一直在研究水平视图寻呼机的这些教程:http: //mobile.tutsplus.com/tutorials/android/android-user-interface-design-horizo​​ntal -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): 致命异常: main 08 -24 01:44:34.370: E/AndroidRuntime(15115): java.lang.RuntimeException: 无法启动活动 ComponentInfo{com.echaractersheet/com.echaractersheet.CharacterStats1}: java.lang.NullPointerException


characterstats.xml:

<android.support.v4.view.ViewPager
android:layout_width="match_parent"
android:layout_height="match_parent"
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);
4

1 回答 1

0

好吧,寻呼机将使用适配器中的数据,因此只要将对象保留在适配器中,就可以了。所以也许在进入下一个屏幕之前,您应该将对象保存在适配器中(可能保存到另一个类中的静态字段,只是一会儿),当您进入新页面时,您可以检索对象并将它们放入适配器中新的 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;
    }

}

视图寻呼机适配器

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 才能知道您已经获取了该值。希望能帮助到你。

注意:此代码不会按原样工作,需要更多代码。

于 2012-08-24T17:22:57.917 回答