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

时间: 2024-10-09 20:56:06

Setting 之dashboard 点击跳转流程的相关文章

阻止a标签点击跳转刷新

这是一个所有做前端都会遇到的问题: 布局是这样的,有一个宽高100px背景为红的div,默认是display:none 隐藏状态: 给两个a标签绑定的同一个click事件,改变div的display为block:让其显示: 但是第一个a标签点击后div刚出现立马就没有了:第二个a标签点击后div会正常显示: 初遇到这个问题的时候,马虎点的童鞋可能要迷茫很久都找不到原因,而细心点就会发现是a标签点击后页面刷新了,所以闪过: 一部分童鞋始终不知道怎么阻止a标签跳转,于是就换用其他标签,避免给a标签添

html锚点 点击跳转到页面指定位置

本来是在看阮大神写的ajax教程,突然发现点击目录文字会跳转到相对应的文本内容,于是乎激发了我的兴趣. 这个究竟怎么做的,刚开始看的时候一知半解,找度娘就是:"点击跳转到页面指定位置",找了下,原来专业术语叫:锚点. 度娘真是个博大精深的地方,有着多种的方法可以使用. 最简单的一种: 设置a标签的锚点就行啦,但是有个确定链接会更改,不利于刷新 <div class="skip" id="skip"> <h2>目录</

【iOS】UIAlertView 点击跳转事件

iOS 开发中,UIAlertView 经常用到.这里记录下曾用到的点击跳转事件. UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示" message:@"退出" delegate:self cancelButtonTitle:@"确认" otherButtonTitles:nil]; if ([@"请记住新密码" isEqualToString:resu

启动页分为4页,最后一页有一个按钮,点击跳转到主页面

代码效果为:启动页分为4页,最后一页有一个按钮,点击跳转到主页面. 上代码: - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. UIScrollView * sv = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, 320, 460)]; sv.contentSize = CGSizeMake(320

点击跳转到系统图库,然后将选择回来的图片显示到应用上

有时候需要跳转到系统图库选图,那么用以下代码实现 /**点击跳转到系统图库,然后将选择回来的图片显示到应用上*/ public class MainActivity extends Activity { private ImageView iv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.act

Android使用Webview显示页面以及点击跳转StartActivity问题

以下是个人拙见,大神可直接忽略. 直接奔入主题,android的一个webview控件相信大家都特别熟悉了,可以用来加载显示网页,像商城的商品图文详情就可以用网页很快实现,但是最近项目中遇到不一样的问题,商品首页用webview显示,点击某一个商品或者商品分类startactivity跳转自身的界面,首页混杂一部分网页加载肯定会遇到界面显示卡顿,显示慢的问题,不过既然需求是这样,也只能照做了. 显示一个网页就不说了,首先,先优化一下显示速度问题,也就是显示文字和图片的先后,在oncreate方法

小程序点击跳转外部链接 微信小程序提示:不支持打开非业务域名怎么办 使用web-view 配置业务域名

小程序点击跳转外部页面 1.index.wxml  添加点击事件   标签可以是小程序支持的 <!-- 邀请好友 --> <cover-image src='/img/invitation.png' class='img-invitation' bindtap='invitation'></cover-image> 2.index.js   添加事件 invitation: function () { var that = this; wx.showModal({ ti

Android中实现图片点击跳转,菜鸟在线等 急求助

============问题描述============ 我想做一个点击图片然后跳转到其他界面的效果, 也就是实现图片点击事件  但是我不知道怎么监听点击事件 求助 ============解决方案1============ ImageView给个attr: android:id="@+id/image" android:clickable="true" 然后Activity实现View.OnClickListener接口,并实现onClick()方法,然后根据id

ScrollView(2)轮播图-点击跳转

轮播图的实现就是使用的ScrollView.它具有滑动切换功能.我们在淘宝上.新闻页看到的图片可以选择滚动的都是用ScrollView实现的.在轮播图中用到的属性有:UIPageControl .UIView.UIScrollView .UITableViewDelegate.并设置为全局变量. UIPageControl *_pageControl; UIView *_headerView; UIScrollView *_headScrollView; 用Main.storyboard直接设置