android Settings入门

五年了,该走了。感谢qisda.

分析下settings的启动过程。版本是4.0的。在Launcher的public boolean onCreateOptionsMenu(Menu menu) 设置了如何启动settings. 就是发送个Intent.

 Intent settings = new Intent(android.provider.Settings.ACTION_SETTINGS);
        settings.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
                | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);

进入了app/Settings onCreate--->super.onCreate(PreferenceAcrtivity)-->setContentView(com.android.internal.R.layout.preference_list_content);

这句是布置了画面。然后会回调public void onContentChanged()获取了listView的对象。然后继续往下进入了--》

onBuildHeaders(mHeaders);这个东西是关键,这个实际叫到了Settings->onBuildHeaders 这个函数会解释xml 也就是画面文件了。loadHeadersFromResource(R.xml.settings_headers, headers);这个东西就是在解释xml文件,苏州qisda, 臧春杰  如何解释xml呢?呵呵。这个有固定格式的 这里也是用到了Adatper, private static class HeaderAdapter extends ArrayAdapter<Header>, 既然是adapter, 哪肯定都是前台显示和数据源关联起来,前台就是listview.哪真正的数据就是解释的xml存放到了arrayList里了。也就是mHeaders,

  target.add(header); 继续从PreferenceActivity onCreate往下走,到了else if (mHeaders.size() > 0) {
            setListAdapter(new HeaderAdapter(this, mHeaders));

这就是把刚才的数据源绑定到了Adapter, 已被listview借口转换。这样就可以通过getView返回了,当时这里都是使用了tag 加判断重用。一贯的做饭,nancy很清楚的。

同时listView 注册了listener  mList.setOnItemClickListener(mOnClickListener);

private AdapterView.OnItemClickListener mOnClickListener = new AdapterView.OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View v, int position, long id)
        {
            onListItemClick((ListView)parent, v, position, id);
        }
    };

当用户touch的时候,在settings里告诉系统做什么。

 

 protected void onListItemClick(ListView l, View v, int position, long id) {
        super.onListItemClick(l, v, position, id);  //苏州 佳世达 臧春杰

 

        if (mAdapter != null) {
            Object item = mAdapter.getItem(position);
            if (item instanceof Header) onHeaderClick((Header) item, position);
        }
    }

最后进入到了settings-->onHeaderClick 做处理,当然叫到了preferenceActivity的 onHeaderClick 如果用户指定了fragement. 哪就

startWithFragment(header.fragment, header.fragmentArguments, null, 0,
                        titleRes, shortTitleRes);

如果用户没指定,就直接启动else if (header.intent != null) {
            startActivity(header.intent);
        }

 

 以上就是settings启动过程。 当然后续还会有进入fragement的动作。还有settings provider的数据库存储。先写到这里。让nancy浏览。

posted on 2013-05-20 11:31  nanjing  阅读(12103)  评论(1编辑  收藏  举报

导航