iosched

前提をもの凄く端折っている点はご容赦下さい。その上、このエントリは調べてる最中なログなので記述一般が非常に微妙になる可能性が高いことを先にお断りしておきます。

ScheduleMultiPaneActivity

DashboardActivity から Schedule なボタンをナニした callback の中で HoneycombTablet な場合、ScheduleMultiPaneActivity が startActivity されます。
ここで setContentView している res/layout-xlarge-v11/activity_schedule には ScheduleFragment な記述があるので画面に表示されるはず。
ScheduleFragment の onClick な callback は

                    blockView.setOnClickListener(this);

なソレなので、スケジュールを云々な intent をナニした後で

            ((BaseActivity) getActivity()).openActivityOrFragment(intent);

しております。ここで呼び出されるのは BaseMultiPaneActivity#openActivityOrFragment になるのですが、これが難解。以降で順に見てみます。

openActivityOrFragment メソド

BaseMultiPaneActivity の実装になります。

    public void openActivityOrFragment(final Intent intent) {
        final PackageManager pm = getPackageManager();
        List<ResolveInfo> resolveInfoList = pm
                .queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
        for (ResolveInfo resolveInfo : resolveInfoList) {

上記、一体何をしているのか、と言いつつ Google 先生にお伺いを立てた所、@yanzm の中の人のブログに見事に hit してます。

呼び出し元の記述が以下です。

            final Intent intent = new Intent(Intent.ACTION_VIEW, sessionsUri);
            intent.putExtra(SessionsFragment.EXTRA_SCHEDULE_TIME_STRING,
                    ((BlockView) view).getBlockTimeString());
            ((BaseActivity) getActivity()).openActivityOrFragment(intent);

ACTION_VIEW な Action を処理できる Activity のリストを resolveInfoList に格納している訳ですな。ちなみに ACTION_VIEW なソレは以下な模様です。

  • .ui.phone.TracksActivity
  • .ui.phone.SessionsActivity
  • .ui.phone.SessionDetailActivity
  • .ui.phone.VendorsActivity
  • .ui.phone.VendorDetailActivity

えーと全部電話なんですが、と言いつつ for な繰り返しの先頭で呼び出されている以下の処理を確認してみます。

            final FragmentReplaceInfo fri = onSubstituteFragmentForActivityLaunch(
                    resolveInfo.activityInfo.name);

この onSubstituteFragmentForActivityLaunch というメソドですが、ScheduleMultiPaneActivity クラスで定義されているものが呼び出されるはず。定義を以下に引用。

    public FragmentReplaceInfo onSubstituteFragmentForActivityLaunch(String activityClassName) {
        if (SessionsActivity.class.getName().equals(activityClassName)) {
            getSupportFragmentManager().popBackStack();
            findViewById(R.id.fragment_container_schedule_detail).setBackgroundColor(0);
            return new FragmentReplaceInfo(
                    SessionsFragment.class,
                    "sessions",
                    R.id.fragment_container_schedule_detail);
        } else if (SessionDetailActivity.class.getName().equals(activityClassName)) {
            findViewById(R.id.fragment_container_schedule_detail).setBackgroundColor(0);
            return new FragmentReplaceInfo(
                    SessionDetailFragment.class,
                    "session_detail",
                    R.id.fragment_container_schedule_detail);
        }
        return null;
    }

う。SessionsActivity か SessionDetailActivity かで条件分岐してます。これ、実機接続してデバッガでごにょごにょする手はアリですね。
とりあえずこの時点で確認必要なのは

  • FragmentReplaceInfo って何
  • getSupportFragmentManager().popBackStack() メソドが何をしているのか

ちょっと今日は

体調崩し気味 && モチベーション的に微妙 && レイゾウコ壊れ気味ってコトで力尽きます。