• 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

     

  • 相关阅读:
    解决“在多字节的目标代码页中,没有此Unicode字符可以映射到的字符”
    实际遭遇并解决:类型“ASP.global_asax”同时存在的问题
    ASP.NET最误导人的错误提示:“未预编译文件,因此不能请求该文件”
    用AutoHotKey彻底解决“Ctrl键+鼠标滚动”时的缩放问题
    .NET Core与.NET Framework、Mono之间的关系
    初识IStructuralEquatable接口
    SQL Server中DateTime与DateTime2的区别
    用word-break: break-all解决不正确换行问题
    Helios与Katana的区别
    简单理解在Mac OS X上运行ASP.NET程序
  • 原文地址:https://www.cnblogs.com/l2rf/p/6371374.html
Copyright © 2020-2023  润新知