シンプルなリマインダーアプリを作ろうとしています。新しいリマインダーを作成するとき、次の設定があります。
- MainEditActivity.java : 次のフラグメントの 2 つのプレースホルダー FrameLayout:
- EditNameFragment.java
- カスタム アクション バー (キャンセル、OK ボタン)
- リマインダー名の EditText
- 次のフラグメントのいずれかを切り替える CheckBox
- EditDateFragment.java または EditLocationFragment.java (どちらにも多くのビューがあります)
- EditNameFragment.java
MainEditActivity.java:
private LocationFragment mLocationFragment;
private DateFragment mDateFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_new_remainer_main); // 2 frame layouts
if (savedInstanceState == null) {
Fragment newFragment = new NewReminderFragment();
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.add(R.id.reminder_title_fragment, newFragment).commit();
mDateFragment = new DateFragment();
ft = getFragmentManager().beginTransaction();
ft.add(R.id.date_or_location_fragment, mDateFragment).commit();
}
}
public void onCheckBoxClick(View view)
{
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
if(mLocationFragment == null)
mLocationFragment = new LocationFragment();
CheckBox checkBox = (CheckBox)findViewById(R.id.checkBoxID);
if(checkBox != null)
{
if(checkBox.isChecked()) {
fragmentTransaction.replace(R.id.date_or_location_fragment, mLocationFragment);
} else {
fragmentTransaction.replace(R.id.date_or_location_fragment, mDateFragment);
}
fragmentTransaction.commit();
}
@Override
public void handleEvent(EventInfo event) {
// here I get all the data (name, data, time, location, etc)
}
EditNameFragment.java:
private EventHandler mEventHandler;
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
mEventHandler = (EventHandler)activity;
}
View doneButton = actionBarButtons.findViewById(R.id.doneBtnTextID);
doneButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
createNewReminder();
}
});
private void createNewReminder()
{
// Event info object to store all information (reminder name, data, time, etc)
EventInfo eventInfo = new EventInfo();
// access either Date or Location Fragment (depending on which is visible)
// FIXME: access the fragments and get the data
// let the activity know to display the new reminder
mEventHandler.handleEvent(eventInfo);
}
質問: すべての要素と ViewFlipper を含む 1 つの MainActivity のみを使用して開始しました。それから、最終的にタブレットにうまく適応するには、フラグメントの方が優れていると読みました。これはこれをレイアウトする正しい方法ですか?
質問: EditNameFragment.javaからデータを取得する方法を知っています。しかし、ユーザーがEditDataFragmentまたはEditLocationFragmentから入力したデータを取得するにはどうすればよいでしょうか? ビューにアクセスするには、MainActivity 内のこれら 2 つの Fragment のインスタンスが必要ですか? それとも、EventHandler で行ったような別のコールバックが必要ですか? はいの場合、ルールは各フラグメントにコールバックを設定することですか?
これらのコンポーネント間の通信フローに少し苦労していると思います。そして、フラグメントからフラグメントへの通信は良い設計ではないことを私は知っています