web-dev-qa-db-ja.com

Android:フラグメントをネストできますか?

別のFragmentのレイアウトにFragmentを貼り付けることは可能ですか?誰かがこれを試しましたか?

30

最後に! Android 4.2アップデートには、ネストされたフラグメントのデフォルトサポートが付属しており、互換性もあります: Official NestedFragments 。さらに、ネストされたフラグメントのサポートは、最新の11番目のリビジョンで発表されました v4サポートライブラリ

46
Dan Elkayam

いいえ、フラグメントは現在階層内にありません。あるフラグメントを別のフラグメントに埋め込もうとすると、問題が発生する可能性があり、多くの場合、微妙です。

7
hackbod

編集: ACLv11以降、これはreplace(...)ViewPagersを動的に行う場合にのみ必要です。

はい、できますが、面倒な方法がいくつかありますが、FragmentViewPagersを埋め込んでいます。

XMLに埋め込む場合、レイアウトを膨らませても問題はありません。

フラグメントを別のフラグメント内に動的に埋め込むと、問題が発生します。可能ですが。

通常、ハンドラーへの投稿が含まれます。ハンドラーは、現在のフラグメント遷移が別の遷移を開始した後に実行されます。これにより、フラグメントを非常に簡単に埋め込むことができます。ただし、これは他の問題につながるため、これをどのように実装するかに注意する必要があります。

FoodTestFeastには、動的に削除および追加されるViewPagerが埋め込まれています。

My Base FragmentViewPager-ビューページャーを保持するフラグメント(FragmentPagerAdapterがあります)

これを使用したクラッシュはまだ見ていませんが、他にクラッシュが発生した場合はお知らせください。

/**
 * @project FoodFeast
 * @author chris.jenkins
 * @created Dec 28, 2011
 */
package couk.jenxsolution.food.ui.fragments;

import Android.os.Bundle;
import Android.os.Handler;
import Android.support.v4.app.FragmentStatePagerAdapter;
import Android.support.v4.view.ViewPager;
import Android.view.LayoutInflater;
import Android.view.View;
import Android.view.ViewGroup;

import com.viewpagerindicator.TabPageIndicator;

import couk.jenxsolution.food.R;
import couk.jenxsolution.food.app.FoodApplication;

/**
 * @author chris.jenkins
 */
public class QuizPagerBaseFragment extends QuizBaseFragment
{

    // Data
    private FragmentStatePagerAdapter mAdapter = null;

    // Views
    private int layoutRes;
    private View mRootView;
    private ViewPager mPager;
    private TabPageIndicator mIndicator;

    // Handlers
    private final Handler handler = new Handler();
    private Runnable runPager;
    private boolean mCreated = false;

    /**
     * @see Android.support.v4.app.Fragment#onCreateView(Android.view.LayoutInflater,
     *      Android.view.ViewGroup, Android.os.Bundle)
     */
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
        mRootView = inflater.inflate(layoutRes, container, false);
        mPager = (ViewPager) mRootView.findViewById(R.id.pager);
        mPager.setOffscreenPageLimit(2);
        mIndicator = (TabPageIndicator) mRootView.findViewById(R.id.indicator);
        mIndicator.setTypeface(FoodApplication.getInstance().getTFs().getTypeFaceBold());

        return mRootView;
    }

    /**
     * @see Android.support.v4.app.Fragment#onActivityCreated(Android.os.Bundle)
     */
    @Override
    public void onActivityCreated(Bundle savedInstanceState)
    {
        super.onActivityCreated(savedInstanceState);
        if (runPager != null) handler.post(runPager);
        mCreated = true;
    }

    /**
     * @see Android.support.v4.app.Fragment#onPause()
     */
    @Override
    public void onPause()
    {
        super.onPause();
        handler.removeCallbacks(runPager);
    }

    /**
     * Set the ViewPager adapter from this or from a subclass.
     * 
     * @author chris.jenkins
     * @param adapter
     */
    protected void setAdapter(FragmentStatePagerAdapter adapter)
    {
        mAdapter = adapter;
        // mAdapter.notifyDataSetChanged();
        runPager = new Runnable() {

            @Override
            public void run()
            {
                mPager.setAdapter(mAdapter);
                mIndicator.setViewPager(mPager);
                // mAdapter.notifyDataSetChanged();
                mIndicator.setVisibility(View.VISIBLE);
            }
        };
        if (mCreated)
        {
            handler.post(runPager);
        }
    }

    /**
     * Has to be set before onCreateView
     * 
     * @author chris.jenkins
     * @param layoutRes
     */
    protected void setLayoutRes(int layoutRes)
    {
        this.layoutRes = layoutRes;
    }

}

参考までに、レイアウトは次のように(または同様に)表示する必要があります:インジケーター=なくなったことに注意してください!

<?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" >

    <com.viewpagerindicator.TabPageIndicator
        Android:id="@+id/indicator"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content" 
        Android:visibility="gone"/>

    <Android.support.v4.view.ViewPager
        Android:id="@+id/pager"
        Android:layout_width="fill_parent"
        Android:layout_height="0dp"
        Android:layout_weight="1" />

</LinearLayout>
5
Chris.Jenkins

ネストされたフラグメントを使用できないことを解決する賢い方法は、v4とネイティブフラグメントの両方を使用することです。それは機能し(私は多くのアプリで使用しています)、場合によっては、この制限を回避する必要があります。

明らかに、アクティビティでは、getFragmentManager()またはgetSupportFragmentManager()を使用して、フラグメントの2つのグループを区別できます。

おそらくそれの非推奨の使用法ですが、それは私に多くの状況を解決します。

0
Alecs