0

私は最近、Android用のプログラミングを再開し、現在、水平ビューページャーを実装したいアプリに取り組んでいます。これにより、ユーザーは1つのインスタンスで2つのページ間をスワイプして情報を入力/更新し、後のインスタンスでは4つのページ間をスワイプできます入力/更新した情報を表示します。基本的にロールプレイングゲーム用の電子キャラシートを作っています。

私は、水平ビューページャーのこれらのチュートリアルに取り組んでいます: 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): 致命的な例外: メイン 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 は、スワイプしたい 2 つのページです。

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

ページャはアダプタ内のデータを処理するので、オブジェクトをアダプタ内に保持している限り問題ありません。そのため、次の画面に進む前に、オブジェクトをアダプターに保存する必要があります (おそらく、別のクラスの静的フィールドに、しばらくの間)。新しいページに移動すると、オブジェクトを取得してアダプターに配置できます。新しいビューページャーの新しいページを追加します。それがあなたの場合に私がすることです。

アップデート:

これは単なる例です。これにはさらに多くのコード行が必要ですが、良いスタートです。

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 は、次のアクティビティに渡すページのリストを保持する場所です。また、2 番目のアクティビティの静的フィールドは、アクティビティ間のブリッジとして使用するためのものであり、過度に使用するべきではありません。そのため、データをフェッチした後、既に値を取得したことを知るために NULL に設定する必要があります。それが役に立てば幸い。

注:このコードはそのままでは機能しません。さらにコードが必要です。

于 2012-08-24T17:22:57.917 に答える