私はここで多くの良い情報を読み、良い進歩を遂げましたが、今は立ち往生しています. 現在の状態の私の Android プロジェクトは、Action Bar Sherlock で構築された 2 つのナビゲーション タブを備えた ViewPager で構成されています。1 つのタブは ListFragment で、もう 1 つのタブは現在、テスト目的の単なる Fragment です。新しいアクティビティを開くのではなく、ListFragment と同じコンテナー内の ListFragment を詳細フラグメントに置き換えたいと考えています。このフォーラムで提案されているレイアウトを使用して、これを行うことができます (FrameLayout ラッパーがないと、詳細を読み込むことができません)。
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:fadingEdge="none" >
<FrameLayout
android:id="@+id/main_container"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<android.support.v4.view.ViewPager
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</FrameLayout>
</RelativeLayout>
リスト項目がクリックされたときに、メインのアクティビティへのコールバックを使用します。
ListFragment から:
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
mCallback.onItemSelected(position);
}
メインのアクティビティでは:
public void onItemSelected(int position) {
TestDetailsFragment newFragment = new TestDetailsFragment();
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.main_container, newFragment);
ft.addToBackStack(null);
ft.commit();
}
そして最後に、私の TestDetailsFragment:
public class TestDetailsFragment extends SherlockFragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.test_layout, container, false);
return view;
}
}
私の問題は、詳細フラグメントがロードされたときに ListFragment が表示されたままになることです。「戻る」を押すと、詳細テキストが消えます。押し戻さずにスワイプして別の Fragment に移動すると、詳細テキストが残ります。ft.replace(R.id.main_container, newFragment);を変更できればと思います。ft.replace (R.id.containerId of ViewPager page , newFragment)には機能しますが、多くの検索にもかかわらず、その方法がわかりません。次の方法でリスト レイアウトを置き換えようとしましたが、これも機能しませんでした (エラー: *my_list_layout* のビューが見つかりません): ft.replace(R.id.my_list_layout, newFragment); ListFragment レイアウトの XML は次のとおりです。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/my_list_layout"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ListView android:id="@android:id/list"
android:layout_height="wrap_content"
android:layout_width="fill_parent" />
ご提案いただきありがとうございます。
私はこれ(ここへの最初の投稿)に本当に慣れていないので、本当に明白な何かが欠けている場合に備えて、主な活動全体をここに置きます. ありがとうございました!
import java.util.ArrayList;
import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.util.Log;
import com.actionbarsherlock.app.ActionBar;
import com.actionbarsherlock.app.ActionBar.Tab;
import com.actionbarsherlock.app.SherlockFragmentActivity;
public class MainActivity extends SherlockFragmentActivity
implements MyListFragment.OnItemSelectedListener {
ViewPager mViewPager;
TabsAdapter mTabsAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setTitle(R.string.app_name);
setContentView(R.layout.main);
ViewPager mViewPager = (ViewPager)findViewById(R.id.pager);
final ActionBar actionBar = getSupportActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
actionBar.setDisplayShowTitleEnabled(true);
actionBar.setHomeButtonEnabled(true);
actionBar.setIcon(R.drawable.ic_title);
mTabsAdapter = new TabsAdapter(this, mViewPager);
mTabsAdapter.addTab(actionBar.newTab().setText("tab1"), MyFragment.class, null);
mTabsAdapter.addTab(actionBar.newTab().setText("tab2"), MyListFragment.class, null);
if (savedInstanceState != null) {
actionBar.setSelectedNavigationItem(savedInstanceState.getInt("tab", 0));
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt("tab", getSupportActionBar().getSelectedNavigationIndex());
}
public void onItemSelected(int position) {
TestDetailsFragment newFragment = new TestDetailsFragment();
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.main_container, newFragment);
ft.addToBackStack(null);
ft.commit();
}
public static class TabsAdapter extends FragmentStatePagerAdapter
implements ActionBar.TabListener, ViewPager.OnPageChangeListener {
private final Context mContext;
private final ActionBar mActionBar;
private final ViewPager mViewPager;
private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>();
static final class TabInfo {
private final Class<?> clss;
private final Bundle args;
TabInfo(Class<?> _class, Bundle _args) {
clss = _class;
args = _args;
}
}
public TabsAdapter(SherlockFragmentActivity activity, ViewPager pager) {
super(activity.getSupportFragmentManager());
mContext = activity;
mActionBar = activity.getSupportActionBar();
mViewPager = pager;
mViewPager.setAdapter(this);
mViewPager.setOnPageChangeListener(this);
}
public void addTab(ActionBar.Tab tab, Class<?> clss, Bundle args) {
TabInfo info = new TabInfo(clss, args);
tab.setTag(info);
tab.setTabListener(this);
mTabs.add(info);
mActionBar.addTab(tab);
notifyDataSetChanged();
}
@Override
public int getCount() {
return mTabs.size();
}
@Override
public Fragment getItem(int position) {
TabInfo info = mTabs.get(position);
return Fragment.instantiate(mContext, info.clss.getName(), info.args);
}
@Override
public void onPageScrolled(int position, float positionOffset,
int positionOffsetPixels) {
}
@Override
public void onPageSelected (int position) {
mActionBar.setSelectedNavigationItem(position);
}
@Override
public void onPageScrollStateChanged(int state) {
}
@Override
public int getItemPosition(Object object) {
return PagerAdapter.POSITION_NONE;
}
@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
Object tag = tab.getTag();
for (int i=0; i<mTabs.size(); i++) {
if (mTabs.get(i) == tag) {
mViewPager.setCurrentItem(i);
}
}
}
@Override
public void onTabUnselected (Tab tab, FragmentTransaction ft) {
}
@Override
public void onTabReselected (Tab tab, FragmentTransaction ft) {
}
}
}