Fragment
を別のレイアウトに貼り付けることは可能Fragment
ですか? 誰もこれを試しましたか?
4 に答える
ついに!Android 4.2 アップデートには、ネストされたフラグメントのデフォルト サポートが付属しており、これも互換性があります: Official NestedFragments。さらに、ネストされた Fragments のサポートは、v4 サポート ライブラリの最新の第 11 リビジョンで発表されました。
いいえ、フラグメントは現在、階層化されていません。1 つのフラグメントを別のフラグメントに埋め込もうとすると、問題が発生する可能性があります。
編集:replace(...)
ViewPagers
ACLv11 の時点では、これは動的な場合にのみ必要です。
はい、できますが、面倒な方法もありますが、FragmentViewPagers を埋め込んでいます。
XML に埋め込む場合、レイアウトが膨張しても問題はありません。
フラグメントを別のフラグメント内に動的に埋め込むと、問題が発生します! 可能ですが。
一般に、現在のフラグメント遷移の後に実行され、別のフラグメントを開始するハンドラーへの投稿が含まれます。このようにして、フラグメントを非常に簡単に埋め込むことができます。ただし、これは他の問題につながるため、これを実装する方法には注意が必要です。
FoodTestFeast には、動的に削除および追加される ViewPagers が埋め込まれています。
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>
ネストされたフラグメントを使用できないことを解決するスマートな方法は、v4 とネイティブ フラグメントの両方を使用することです。それは機能し (私は多くのアプリで使用しています)、場合によっては、この制限を回避するために必要なものもあります。
明らかに、アクティビティではgetFragmentManager()またはgetSupportFragmentManager()を使用してフラグメントの 2 つのグループを区別できます。
おそらく非推奨の使用法ですが、多くの状況を解決してくれます。