いくつかのフラグメントを表示するためにビューページャーを使用しようとしています。現時点では、フラグメントは1つしかありませんが、インスタンス化されることはありません。私はpager.setCurrentItem(0)を使ってみましたが、アダプタ内のgetItemメソッドは決して呼び出されません。私のフラグメントが以下のコードにロードされていない理由は誰にも見えますか?ViewPager + Fragments - フラグメントが表示されない
主な活動
public class MainActivity extends SherlockFragmentActivity {
MyPagerAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Create the FragmentPager Adapter and assign it to the viewpager
adapter = new MyPagerAdapter(getSupportFragmentManager(), this);
ViewPager pager = (ViewPager) findViewById(R.id.pager);
pager.setAdapter(adapter);
pager.setCurrentItem(0);
// Setup the tab page indicator
TabPageIndicator indicator = (TabPageIndicator) findViewById(R.id.indicator);
indicator.setViewPager(pager);
}
class MyPagerAdapter extends FragmentStatePagerAdapter {
private SparseArray<Fragment> fragmentPageMap;
public MyPagerAdapter(FragmentManager fm, Activity context) {
super(fm);
fragmentPageMap = new SparseArray<Fragment>();
}
@Override
public Fragment getItem(int index) {
switch (index) {
case 0:
if (fragmentPageMap.get(index) != null) {
SherlockListFragment scheduleFragment = ScheduleListFragment.newInstance();
fragmentPageMap.put(index, scheduleFragment);
return scheduleFragment;
} else {
return fragmentPageMap.get(index);
}
default:
return null;
}
}
/*@Override
public void destroyItem(View container, int index, Object object) {
super.destroyItem(container, index, object);
fragmentPageMap.remove(index);
}*/
@Override
public CharSequence getPageTitle(int index) {
return ((ViewPagerPage) fragmentPageMap.get(index)).getTitle();
}
@Override
public int getCount() {
return fragmentPageMap.size();
}
}
public interface ViewPagerPage {
String getTitle();
}
MainActivityレイアウト
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<com.viewpagerindicator.TabPageIndicator
android:id="@+id/indicator"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textStyle="bold" />
<android.support.v4.view.ViewPager
android:id="@+id/pager"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1" />
</LinearLayout>
ScheduleListFragment
public class ScheduleListFragment extends SherlockListFragment implements ViewPagerPage {
private ScheduleAdapter adapter;
private final String TITLE = "Schedule";
public static ScheduleListFragment newInstance() {
ScheduleListFragment newFrag = new ScheduleListFragment();
Bundle args = new Bundle();
newFrag.setArguments(args);
return newFrag;
}
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_schedule_list, null);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.fragment_schedule_list, menu);
}
// Container Activity must implement this interface
public interface OnAddItemClickedListener {
public void onAddItemClicked();
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle item selection
switch (item.getItemId()) {
case R.id.add_item:
Intent myIntent = new Intent(getActivity(), AddScheduleItemActivity.class);
startActivityForResult(myIntent, 1);
return true;
default:
return super.onOptionsItemSelected(item);
}
}
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
setHasOptionsMenu(true);
adapter = new ScheduleAdapter(getActivity());
setListAdapter(adapter);
}
private class SampleItem {
public String tag;
public int iconRes;
public SampleItem(String tag, int iconRes) {
this.tag = tag;
this.iconRes = iconRes;
}
}
public class ScheduleAdapter extends ArrayAdapter<SampleItem> {
public ScheduleAdapter(Context context) {
super(context, 0);
}
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = LayoutInflater.from(getContext()).inflate(R.layout.results_list_row, null);
}
ImageView icon = (ImageView) convertView.findViewById(R.id.row_icon);
icon.setImageResource(getItem(position).iconRes);
TextView title = (TextView) convertView.findViewById(R.id.row_title);
title.setText(getItem(position).tag);
return convertView;
}
}
@Override
public String getTitle() {
return TITLE;
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == android.app.Activity.RESULT_OK) {
String name = (String) data.getExtras().get("TEXT");
Toast.makeText(getActivity(), name, Toast.LENGTH_LONG).show();
}
}
フラグメントレイアウト
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ListView
android:id="@android:id/list"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TextView" />
</LinearLayout>
おかげで、 ネイサン
現在のソリューション:
は、最初のフラグメントを初期化し、内部のマップに追加するアダプタのコンストラクタを変更しました。誰でもこれをやって間違ったことを見ているのですか、上に掲載されたコードを改善する方法はありますか?ありがとう!
public MyPagerAdapter(FragmentManager fm, Activity context) {
super(fm);
fragmentPageMap = new SparseArray<Fragment>();
SherlockListFragment scheduleFragment = ScheduleListFragment.newInstance();
fragmentPageMap.put(0, scheduleFragment);
}
*なぜ* getCount()が0を返すと思いますか?より良い答えを出すために詳しく説明してください。 –
'fragmentPageMap'はコンストラクタで作成され、' getCount() 'が呼び出されると空です。 'getCount()'は 'getItem(index)'の前に呼び出されます。これはデバッガで確認できます。 – rubenlop
ありがとうございました!あなたは0を返すことが正しいです。しかし、私は値をハードコードする必要はないと思う、私は動的にフラグメントを追加/削除できるようにしたい。間もなくフラグメントが追加されるため、switch文があります。 – Nath5