zoukankan      html  css  js  c++  java
  • Setting 之dashboard 点击跳转流程

    设置的主界面的可以通过修改xml中的dashboard_categaries.xml 文件实现,在DashboardSummary.java 文件中的rebuildUI()方法中将xml对应的实体类转换成对应的view,具体细节可以看设置源码。

    一,dashboard_categaries中定义节点的样式:

     1  <!-- Wifi -->
     2         <dashboard-tile
     3             android:id="@+id/wifi_settings"
     4             android:fragment="com.android.settings.wifi.WifiSettings"
     5             android:icon="@drawable/sunmi_wifi"
     6             android:title="@string/wifi_settings_title" />
     7         <!-- 移动网络 -->
     8         <dashboard-tile
     9             android:id="@+id/mobile_net_settings"
    10             android:icon="@drawable/sunmi_network"
    11             android:title="@string/network_settings_title" >
    12             <intent
    13             android:action="android.intent.action.MAIN"
    14             android:targetClass="com.android.phone.MobileNetworkSettings"
    15             android:targetPackage="com.android.phone" />
    16         </dashboard-tile>

    这是设置中的wifi,和移动网络选项,一个是添加fragment ,另一个是添加intent

    解析这个xml是在SettingActivity中的loadCategoriesFromResource(R.xml.dashboard_categories, categories);方法中,

    二,DashboardSummary.java 文件中的rebuildUI()方法

     1 private void rebuildUI(Context context) {
     2         if (!isAdded()) {
     3             return;
     4         }
     5         final Resources res = getResources();
     6         mDashboard.removeAllViews();
     7         List<DashboardCategory> categories = ((SettingsActivity) context).getDashboardCategories(true);
     8         final int count = categories.size();
     9         for (int n = 0; n < count; n++) {
    10             DashboardCategory category = categories.get(n);
    11             View categoryView = mLayoutInflater.inflate(R.layout.dashboard_category, mDashboard, false);
    12             TextView categoryLabel = (TextView) categoryView.findViewById(R.id.category_title);
    13             categoryLabel.setText(category.getTitle(res));
    14 
    15             ViewGroup categoryContent = (ViewGroup) categoryView.findViewById(R.id.category_content);
    16 
    17             final int tilesCount = category.getTilesCount();
    18             for (int i = 0; i < tilesCount; i++) {
    19                 DashboardTile tile = category.getTile(i);
    20                 DashboardTileView tileView = new DashboardTileView(context);
    21                 updateTileView(context, res, tile, tileView.getImageView(), tileView.getTitleTextView(),
    22                         tileView.getStatusTextView());
    23 
    24                 tileView.setTile(tile);
    25                 categoryContent.addView(tileView);
    26             }
    27 
    28             // Add the category
    29             mDashboard.addView(categoryView);
    30         }
    31     }

    分析源码可知rebuildui()是将xml中解析的实体类,构建成对应的view(categoryView,DashboardTileView)在这并没有看到添加点击事件,所以猜测应该写到DashboardTileView中了

    三,DashboardTileView的点击事件

    1 public class DashboardTileView extends FrameLayout implements View.OnClickListener 

    看到这里就知道是在这里实现点击事件处理的

    1  @Override
    2     public void onClick(View v) {
    3         if (mTile.fragment != null) {
    4             Utils.startWithFragment(getContext(), mTile.fragment, mTile.fragmentArguments, null, 0,
    5                     mTile.titleRes, mTile.getTitle(getResources()));
    6         } else if (mTile.intent != null) {
    7             getContext().startActivity(mTile.intent);
    8         }
    9     }

    看到这里一目了然啦,可以知道fragment 优先级>intent 
    再来看fragment的跳转

    四,fragment的跳转细节

     1 public static void startWithFragment(Context context, String fragmentName, Bundle args,
     2             Fragment resultTo, int resultRequestCode, int titleResId,
     3             CharSequence title) {
     4         startWithFragment(context, fragmentName, args, resultTo, resultRequestCode,
     5                 null /* titleResPackageName */, titleResId, title, false /* not a shortcut */);
     6     }
     7 
     8 public static void startWithFragment(Context context, String fragmentName, Bundle args,
     9             Fragment resultTo, int resultRequestCode, String titleResPackageName, int titleResId,
    10             CharSequence title, boolean isShortcut) {
    11         Intent intent = onBuildStartFragmentIntent(context, fragmentName, args, titleResPackageName,
    12                 titleResId, title, isShortcut);
    13         if (resultTo == null) {
    14             context.startActivity(intent);
    15         } else {
    16             resultTo.startActivityForResult(intent, resultRequestCode);
    17         }
    18     }
    19 
    20  public static Intent onBuildStartFragmentIntent(Context context, String fragmentName,
    21             Bundle args, String titleResPackageName, int titleResId, CharSequence title,
    22             boolean isShortcut) {
    23         Intent intent = new Intent(Intent.ACTION_MAIN);
    24         intent.setClass(context, SubSettings.class);
    25         intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT, fragmentName);
    26         intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_ARGUMENTS, args);
    27         intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_TITLE_RES_PACKAGE_NAME,
    28                 titleResPackageName);
    29         intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_TITLE_RESID, titleResId);
    30         intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_TITLE, title);
    31         intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_AS_SHORTCUT, isShortcut);
    32         return intent;
    33     }

    可以知道是通过构建一个带fragmentName参数的intent来启动SubSettings.class 
    而SubSettings.class中并没有实现具体添加fragment,在父类SettingsActivity中oncrreate()中获取具体参数,添加对应fragment

    点击Setting 之dashboard 点击跳转流程就是这样啦

     

     

     

    转自:http://blog.csdn.net/kingyc123456789/article/details/53175624

     

  • 相关阅读:
    HDU 1114 Piggy-Bank
    HDU 2955 Robberies
    NTOJ 290 动物统计(加强版)
    POJ 3624 Charm Bracelet
    HDU 2602 Bone Collector
    POJ 1523 SPF(无向图割顶)
    HDU 5311 Hidden String
    HDU 1421 搬寝室
    HDU 1058 Humble Numbers
    POJ 3259 Wormholes(spfa判负环)
  • 原文地址:https://www.cnblogs.com/l2rf/p/6371374.html
Copyright © 2011-2022 走看看