1

私はここで多くの良い情報を読み、良い進歩を遂げましたが、今は立ち往生しています. 現在の状態の私の 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)  {

    }
}
}
4

1 に答える 1

1

私の問題は、詳細フラグメントがロードされたときに ListFragment が表示されたままになることです

それらの間のフラグメントを置き換えるためのコードは、削除されないあなたの(対応する を含む)FrameLayoutも含む新しい詳細フラグメントを に配置するため、これは正常です。ViewPagerListFragment

ft.replace(R.id.main_container, newFragment); を変更できればと思います。ft.replace(R.id.containerId of ViewPager page, newFragment) に変更しても機能しますが、多くの検索を行ってもその方法がわかりません。

はい、これはオプションになります。新しいネストされたFragmentsAPI (互換パッケージまたは通常Fragmentsの API 16+ で利用可能) を使用することをお勧めします。ListFragmentを新しい詳細に置き換えるだけの場合Fragment(その余分な + スワイプ機能を保持するFragmentためViewPager)、次のようにします。

  • 現在使用している場所にはListFragment、シンプルなラッパーFragment(レイアウトとしてシンプルなFrameLayout) を置きますが、もう一方FragmentViewPager変更されません。
  • getChildFragmentManager()最初に、ラッパーの を使用しFragmentて法線を追加しますListFragment
  • ラッパー フラグメントにコールバック インターフェイスを実装させます。親への参照を取得するには、 のメソッドをFragment使用して、これをリスナーとしてキャストできます。getParentFragment()ListFragment
  • ラッパーが実装するコールバックで、を を使用して詳細Fragmentに置き換えます。ListFragmentFragmentFrameLayout

詳細で を(2 つのフラグメントを一緒に)Fragment置き換えたい場合は、 のレイアウトを変更して、を含むまたは 詳細のいずれかを追加するのみを持つようにします。ViewPagerActivityFrameLayoutFragmentViewPagerFragment

于 2013-01-11T13:33:41.103 に答える