別のレイアウトを表示するために、タブホスト ( Android 2.1 と互換性がある必要があるため、FragmentManagers などはありません) 内でタブを左右にスライドさせる方法を探していました。ViewPager を使用した例はたくさんあるので、Tabhost を捨てて、このコードを実装することにしました。以下に、2 つの「画面」を使用するテスト コードをいくつか示します。ユーザーがクエリを入力したときにプログラムで画面を切り替え (ここでは screen1)、結果のページ (screen2) を表示できるようにする必要があります。ユーザーは、クエリ ページと結果ページの間を前後にスワイプすることもできます。
私が抱えている問題は、ボタンの onClickListener を実装する方法です。通常、これを screen1.java (以下) に実装しますが、ボタンをクリックしても onClickListener が制御されないようです。ViewPager が screen1 レイアウトを機能させる方法は、何らかの形で ViewPager オブジェクトにまとめられていると思います。画面 1 のボタンを取得するためにビューを膨張させようとしましたが、物事が乱雑になり、簡単ではありませんでした。
私が取り組んでいるのは、FlingActivity の ViewPager (myPager) の静的メンバー変数です。PagerAdapter から、screen1 がインスタンス化されたときに、onClickListener をボタン オブジェクトに設定し、ビューが膨張したときに、静的変数 FlingActivity.myPager を参照して、ボタンがクリックされた (ビューを変更した) ときに setCurrentItem() を実行できます。
事は、これはすべて本当に不器用に見えるということです。onClickListener を screen1.java クラスに戻すにはどうすればよいですか?
main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<android.support.v4.view.ViewPager
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/myfivepanelpager"/>
</LinearLayout>
screen1.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/tab1_layout"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TextView" />
<Button
android:id="@+id/button1"
style="?android:attr/buttonStyleSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button" />
<CheckBox
android:id="@+id/checkBox1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="CheckBox" />
</LinearLayout>
screen2.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/tab2_layout"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TextView" />
<Spinner
android:id="@+id/spinner1"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
<ImageView
android:id="@+id/iv_2"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
</LinearLayout>
screen1.java
package test.com.vfling;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
public class screen1 extends Activity
{
private final String TAG = "** screen1 **";
@Override
protected void onCreate (Bundle savedInstanceState)
{
super.onCreate (savedInstanceState);
Log.d (TAG, "oncreate");
setContentView (R.layout.screen1);
}
}
screen2.java
package test.com.vfling;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
public class screen2 extends Activity
{
private final String TAG = "** screen2 **";
@Override
protected void onCreate (Bundle savedInstanceState)
{
super.onCreate (savedInstanceState);
Log.d (TAG, "oncreate");
setContentView (R.layout.screen2);
}
}
MyPagerAdapter.java
package test.com.vfling;
import android.content.Context;
import android.os.Parcelable;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MyPagerAdapter extends PagerAdapter
{
private String TAG = "** MyPagerAdapter **";
@Override
public int getCount ()
{
//Log.d (TAG, "getCount");
return 2;
}
public Object instantiateItem (View collection, int position)
{
Log.d (TAG, "instantiateItem");
LayoutInflater inflater = (LayoutInflater) collection.getContext ().getSystemService (Context.LAYOUT_INFLATER_SERVICE);
int resId = 0;
switch (position)
{
case 0:
resId = R.layout.screen1;
Log.d (TAG, "screen1");
break;
case 1:
resId = R.layout.screen2;
Log.d (TAG, "screen2");
break;
}
View view = inflater.inflate (resId, null);
((ViewPager) collection).addView (view, 0);
switch (position)
{
case 0:
Button b = (Button) view.findViewById (R.id.button1);
b.setOnClickListener (ocl);
Log.d (TAG, "screen1");
break;
}
return view;
}
@Override
public void destroyItem (View arg0, int arg1, Object arg2)
{
Log.d (TAG, "destroyitem");
((ViewPager) arg0).removeView ((View) arg2);
}
@Override
public boolean isViewFromObject (View arg0, Object arg1)
{
Log.d (TAG, "isviewfromobject");
return arg0 == ((View) arg1);
}
@Override
public Parcelable saveState ()
{
return null;
}
OnClickListener ocl = new OnClickListener()
{
@Override
public void onClick (View v)
{
switch (v.getId ())
{
case R.id.button1:
Log.d (TAG, "button 1 click");
FlingActivity.myPager.setCurrentItem (1);
break;
}
}
};
}
FlingActivity.java
package test.com.vfling;
import android.app.Activity;
import android.os.Bundle;
import android.support.v4.view.ViewPager;
public class FlingActivity extends Activity
{
private final String TAG = "** test_vfling **";
public static ViewPager myPager;
@Override
protected void onCreate (Bundle savedInstanceState)
{
super.onCreate (savedInstanceState);
setContentView (R.layout.main);
MyPagerAdapter adapter = new MyPagerAdapter ();
myPager = (ViewPager) findViewById (R.id.myfivepanelpager);
myPager.setAdapter (adapter);
myPager.setCurrentItem (1);
}
}