1

シンプルなリマインダーアプリを作ろうとしています。新しいリマインダーを作成するとき、次の設定があります。

  1. MainEditActivity.java : 次のフラグメントの 2 つのプレースホルダー FrameLayout:
    • EditNameFragment.java
      • カスタム アクション バー (キャンセル、OK ボタン)
      • リマインダー名の EditText
      • 次のフラグメントのいずれかを切り替える CheckBox
    • EditDateFragment.java または EditLocationFragment.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);
   }
  1. 質問: すべての要素と ViewFlipper を含む 1 つの MainActivity のみを使用して開始しました。それから、最終的にタブレットにうまく適応するには、フラグメントの方が優れていると読みました。これはこれをレイアウトする正しい方法ですか?

  2. 質問: EditNameFragment.javaからデータを取得する方法を知っています。しかし、ユーザーがEditDataFragmentまたはEditLocationFragmentから入力したデータを取得するにはどうすればよいでしょうか? ビューにアクセスするには、MainActivity 内のこれら 2 つの Fragment のインスタンスが必要ですか? それとも、EventHandler で行ったような別のコールバックが必要ですか? はいの場合、ルールは各フラグメントにコールバックを設定することですか?

これらのコンポーネント間の通信フローに少し苦労していると思います。そして、フラグメントからフラグメントへの通信は良い設計ではないことを私は知っています

4

1 に答える 1

0
  1. フラグメントは自己完結型のモジュラー コンポーネントであり、他のフラグメントとは独立して提示された場合に意味があります。標準的な例は、新聞記事のリストと記事の表示です...どちらも独立して、または別々に提示でき、それは理にかなっています。あなたの場合、複数のフラグメントを持つことはおそらく不要だと思います。なぜなら、それらは他のものとは独立して意味をなさないからです(または、半分定義されたイベントになってしまうでしょう)。日付を編集するフラグメントが 1 つと、名前を編集するフラグメントが 1 つあるように見えますが、概念的には、2 つのフラグメントが実際にはイベントである 1 つの「オブジェクト」を編集します。したがって、これはおそらく ViewFlipper を使用して 1 つのフラグメント内で行う必要があります。

  2. これを見たことがありますか?

http://developer.android.com/training/basics/fragments/communicating.html

メイン アクティビティには 3 つのフラグメントすべてのインスタンスが必要であり、各フラグメントのインターフェイスを定義してメイン アクティビティに実装する必要があります。

于 2013-04-04T19:35:01.700 に答える