フラグメントとは何ですか
断片は、UIの間で活動に埋め込むことができる断片である、それは活動、活動のミニバージョンとして見ることができるが、それがに関してより柔軟です。断片は、活性のある断片、断片活動も複数存在してもよく、動的または静的荷重であってもよいアクティビティに埋め込まれなければなりません。フラグメントはアクティビティが存在を添付しなければならないので、その活動のライフサイクルは、フラグメントのライフサイクルに影響を与えます。
特に断片を用いて大画面のAndroidデバイス(例えばプレート)に、より完全に画面スペースを利用することができます。ディスプレイは、例えば、携帯電話のインターフェースで、通常2つの異なる活動のニュース一覧やニュースの内容は、ニュースのリスト項目をクリックすると、活動のニュースコンテンツにジャンプします。同時に、携帯電話やタブレットで使用されるコードを作ることができる一方で、タブレットでは、ニュースのリストには、ニュースのリストとニュースコンテンツとしてフラグメントコンテナを使用して、唯一の活動にすることができ、ニュースコンテンツの右に、左にすることができ異なるフラグメントをロードします。
違いとアクティビティのフラグメント
アクティビティはAndroidシステムActivityManager管理の四つの成分の一つです。
フラグメントの存在によるFragmentManager管理のフラグメントは、フラグメントは(導入、置き換え、および削除)活動の自由を制御することができ、活動を取り付けました。
切り替え時活動が明確に感じることができ、直接切り替えながら、有意な切替効果をフラグメント化しません。
使用のフラグメント
1)新しいXMLファイルのレイアウトを作成し、フラグメントUIインターフェイスを設計します。
新しいサブクラスの2)フラグメント。
LayoutInflaterローディングUIインターフェースを使用して3)onCreateViewフラグメント書き換え方法。
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.another_right_fragment, container, false);
}
4)は、静的または動的な方法を使用してアクティビティに追加追加断片。
静的を追加します
静的追加するには、XMLレイアウトに直接追加され、基本的に他のコントロールを使用することと同じでは、アンドロイド:name属性は、サブクラスの作成したばかりの良いフラグメントの完全修飾クラス名を追加フラグメントIDが指定されなければならないことに留意すべきである指定しますそうでない場合は、コンパイル時にエラーにフラグメントIDが指定されていないと報告されます。
<fragment
android:id="@+id/left_fragment"
android:name="com.example.fragmenttest.LeftFragment"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1" />
動的に追加
フラグメントの活動は、実行時に動的にプログラムに追加し、動的に同様の活性ビューを追加する方法することができます。
フラグメントアクティビティ容器としてレイアウトの1)を使用します。
追加される新しいインスタンスの2)断片。
3)活性のFragmentManager現行断片を得、この方法は、イベントでgetSupportFragmentManager()を呼び出すことによって直接得ることができます。
4)取得FragmentManagerを使用するのbeginTransaction()メソッドを呼び出すことにより、開いたトランザクションを開きます。
5)容器または交換断片を追加、一般に、()メソッドの実装で、通過する必要があるとコンテナIDの追加を置き換えに使用され
プラス破片インスタンス。
6)、トランザクションをコミット完全にコミット()メソッドを呼び出します。
replaceFragment(new RightFragment());
private void replaceFragment(Fragment fragment) {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.replace(R.id.right_layout, fragment);
transaction.addToBackStack(null); // 加入返回值
transaction.commit();
}
フラグメントでは、リターンスタックを使用
あなたが同様の効果アクティビティリターンスタックを実現したい場合はフラグメントを追加した後、[戻る]ボタンをクリックして、活動が終了します、あなたは(にFragmentTransactionでaddToBackStackを呼び出す必要があります)フラグメントがスタックに追加戻ります。引数はリターンスタック過渡の名前です。
@param name An optional name for this back stack state, or null.
通信のフラグメント
フラグメントおよびコミュニケーション活動
断片活動と別のクラスは、メソッドは断片アクティビティ、活性またはそのフラグメントで呼び出されたメソッドを呼び出したように、それらの間の通信を実現する方法を、存在しています。
フラグメント活動とコミュニケーション
ダイレクトでの活動は、フラグメントfindViewById()を見ることによって検出されませんが、あなたはActivityからフラグメントのインスタンスを取得することができますので、あなたは、コントロールやレイアウトへの道を見つけるためにFragmentManager()によってfindFragmentByIdを呼び出すことができます
RightFragment rightFragment = (RightFragment) getSupportFragmentManager().findFragmentById(R.id.right_fragment);
断片は、方法は、例えば活性getActivityことによって得ることができます()。
フラグメントフラグメントコミュニケーションと
両者の同じ活性フラグメントの活性を介して間接的に通信することができます。
フラグメントの例
次の手順では、フラグメントは約2含まれ、さらに活動を説明し、白を左、右のプラスワン断片、断片グリーン右、右クリックして、追加の側に番号を追加します左のボタンをクリックしてください左側のボタンは、フラグメント間の通信をテストするために、数プラス1を断片化するであろう。コードは以下の通りであります:
LeftFragment:
public class LeftFragment extends Fragment implements View.OnClickListener {
Button mBtnAdd;
TextView mTvNum;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.left_fragment, container, false);
mBtnAdd = (Button) view.findViewById(R.id.add);
mTvNum = (TextView) view.findViewById(R.id.left_num);
mBtnAdd.setOnClickListener(this);
return view;
}
@Override
public void onClick(View v) {
if (v.getId() == R.id.add) {
((MainActivity) getActivity()).mRightFragment.addNum();
}
}
public void addNum() {
Integer num = Integer.valueOf(mTvNum.getText().toString());
mTvNum.setText(String.valueOf(++num));
}
}
LeftFragmentレイアウト:
<?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">
<TextView
android:id="@+id/left_num"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="10" />
<Button
android:id="@+id/add"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="Right +1" />
</LinearLayout>
RightFragment:
public class RightFragment extends Fragment implements View.OnClickListener {
private static final String TAG = "RightFragment";
Button mBtnAdd;
TextView mTvNum;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.right_fragment, container, false);
mBtnAdd = (Button) view.findViewById(R.id.add);
mTvNum = (TextView) view.findViewById(R.id.right_num);
mBtnAdd.setOnClickListener(this);
return view;
}
@Override
public void onClick(View v) {
if (v.getId() == R.id.add) {
((MainActivity) getActivity()).mLeftFragment.addNum();
}
}
public void addNum() {
Integer num = Integer.valueOf(mTvNum.getText().toString());
mTvNum.setText(String.valueOf(++num));
}
}
RightFragmentレイアウト:
<?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:background="#00FF00"
android:orientation="vertical">
<TextView
android:id="@+id/right_num"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="0" />
<Button
android:id="@+id/add"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="left +1" />
</LinearLayout>
MainActivity:
public class MainActivity extends AppCompatActivity {
public RightFragment mRightFragment;
public LeftFragment mLeftFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mRightFragment = (RightFragment) getSupportFragmentManager().findFragmentById(R.id.right_fragment);
mLeftFragment = (LeftFragment) getSupportFragmentManager().findFragmentById(R.id.left_fragment);
}
}
MainActivityレイアウト:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
tools:context=".MainActivity">
<fragment
android:id="@+id/left_fragment"
android:name="com.example.fragmenttest.LeftFragment"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1" />
<fragment
android:id="@+id/right_fragment"
android:name="com.example.fragmenttest.RightFragment"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1" />
</LinearLayout>
フラグメントのライフサイクル
フラグメントのライフサイクルが影響を受けた活動のライフサイクルとなりますので、断片常に付属のアクティビティが存在するので、フラグメントは、4つの状態を破壊し、一時停止、停止を実行する必要があります。
ラン:彼は活動が実行されている添付ときフラグメントが表示されている場合は、フラグメントが実行されています。
一時停止:アクティビティサスペンド状態に入るように取り付けられた場合、フラグメントはまた、サスペンド状態に入ります。例えば、画面が充填アクティビティをスタックの最上部に追加されていない場合、フラグメント活動はまだ部分的に見えるが、失われた焦点です。
STOP:アクティビティーに取り付けられたときに停止状態に入る(完全に見えない)、及びaddToBackStack()メソッドと呼ばれます。
破壊:活動破壊状態の付着、または完全に見えないフラグメントを入力(またはスタックの最上部を通ります
FragmentTransaction)は、イベントから破片を除去する()メソッドを置き換え、)(削除を呼び出し、addToBackStack()を呼び出していませんでした。
フラグメントコールバックメソッド
コールバックメソッド断片の大半における活性は、加えて、独自のフラグメントのコールバックメソッドを持っていました。
ONATTACH():ときに残骸と関連する活動の呼び出し。
onCreateView():ビュー(ロードされたレイアウトが)破片のために作成したときに呼び出されます。
onActivityCreated():呼び出されたときの破片に関連する活動が作成されていなければならないことを確実にするために。
onDestroyView()。破片に関連付けられたビューが呼び出さ削除する場合。
onDetach()。ときに破片や活動関連付け解除コール:
フラグメントの古典的なケース
フラグメントは、タブレットやモバイルUIの再利用を使用して達成しました
フラグメントの使用マルチエフェクトタブ