[{"data":1,"prerenderedAt":216},["ShallowReactive",2],{"page-Android-1":3,"page-count-Android":42},[4,68,129],{"id":5,"title":6,"body":7,"date":44,"description":13,"extension":45,"meta":46,"navigation":49,"path":61,"seo":62,"stem":63,"tags":64,"__hash__":67},"blogs\u002F_legacy\u002F2012\u002F2012-12-16-android%e7%ae%80%e5%8d%95%e7%9a%84%e5%b0%86activity%e6%94%b9%e4%b8%bafragment.md","Android简单的将Activity改为Fragment",{"type":8,"value":9,"toc":40},"minimark",[10,14,17,20,31,34],[11,12,13],"p",{},"开发android有时会遇到这样的问题，那就是需要将Activity改造成Fragment。",[11,15,16],{},"本来Fragment是新的android版本上的东西，不过既然google这么亲切的提供了向下兼容的包。那么总会有这样的需要的时候，好在Activity到Fragment的转化并不复杂，因为本来就是相似的东西。最近就遇到了这的问题，于是来总结一下经验。",[11,18,19],{},"从Activity到Fragment最大的变动在于，在Fragment里面的onCreate()函数内，是没有办法使用findViewById、setContentView这些函数的。因为Fragment本身并没有提供这些方法。于是我们只能通过onCreateView和onViewCreated来实现对显示的控制。",[21,22,27],"pre",{"className":23,"code":25,"language":26},[24],"language-text","@Override\n\npublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {\n  return inflater.inflate(R.layout.about_detail, container, false);\n}\n\n@Override\n\npublic void onViewCreated(View view, Bundle savedInstanceState) {\n  super.onViewCreated(view, savedInstanceState);\n  version = (TextView) view.findViewById(R.id.version);\n  loginfo = (TextView) view.findViewById(R.id.loginfo);\n}\n","text",[28,29,25],"code",{"__ignoreMap":30},"",[11,32,33],{},"而一些Fragment没有提供的属于Activity的函数我们可以通过getActivity()得到作为parent的Activity来调用，因为Fragment只是作为片段提供给Activity使用的，所以很多功能的实现都被留在了Activity里面。不过无论如何，只要利用Eclipse自带的查错功能可以非常快速的完成这些操作。这种改动一般不会很复杂，只要把Fragment要做的事情交给作为parent的Activity处理就可以了。比如像Intent的处理就可以这样：",[21,35,38],{"className":36,"code":37,"language":26},[24],"Intent i = new Intent();\ni.setClass(getActivity().getApplicationContext(), NewActivity.class);\nstartActivity(i);\ngetActivity().finish();\n",[28,39,37],{"__ignoreMap":30},{"title":30,"searchDepth":41,"depth":42,"links":43},2,3,[],"2012-12-16","md",{"layout":47,"status":48,"published":49,"author":50,"author_login":51,"author_email":52,"author_url":53,"wordpress_id":54,"wordpress_url":55,"date_gmt":56,"excerpt":57},"post","publish",true,{"display_name":51,"login":51,"email":52,"url":53},"chaoshikari","chaoshikari@gmail.com","\u002F",526,"\u002F\u002F?p=526","2012-12-16 03:20:01 +0000",{"type":8,"value":58},[59],[11,60,13],{},"\u002F2012-12-16-android简单的将activity改为fragment",{"title":6,"description":13},"_legacy\u002F2012\u002F2012-12-16-android%e7%ae%80%e5%8d%95%e7%9a%84%e5%b0%86activity%e6%94%b9%e4%b8%bafragment",[65,66],"Android","Fragment","zw6kNcWWbibGeTwLMxpCLu4n37LCz9Uchwjkpz8LiDQ",{"id":69,"title":70,"body":71,"date":44,"description":75,"extension":45,"meta":114,"navigation":49,"path":123,"seo":124,"stem":125,"tags":126,"__hash__":128},"blogs\u002F_legacy\u002F2012\u002F2012-12-16-android%e9%85%8d%e7%bd%ae%e7%b1%bb%e7%9a%84%e4%bd%bf%e7%94%a8.md","Android配置类的使用",{"type":8,"value":72,"toc":112},[73,76,79,85,88,94,97,103,106],[11,74,75],{},"Android本身提供了应用保存配置的机制，虽然有时我们会希望自己来控制配置的过程，但是利用系统自带的配置也是一个不错的选择。",[11,77,78],{},"最重要的是，由于是系统自带的功能，所以调用起来比较简单。而不用只是为了一两个变量就自己去写配置文件的读取和写入这些东西。现在写东西比较偷懒，基本每次都是复制下面的代码然后改改就用了。",[21,80,83],{"className":81,"code":82,"language":26},[24],"\u002F\u002F保存配置信息\nSharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);\nSharedPreferences.Editor editor = settings.edit();\neditor.putString(\"preferences\", mPreferences);\neditor.commit();\n\n\u002F\u002F读取配置信息        \nSharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);\nString mPreferences = settings.getString(\"preferences\", DEFULT_PRES);\n",[28,84,82],{"__ignoreMap":30},[11,86,87],{},"关于getSharedPreferences()，第一个参数是配置文件本身的标识，只要提供字符串就可以了。第二参数则是标识配置文件的读写权限的，一般情况下用0就好了，文档对这个参数的描述是这样的：",[21,89,92],{"className":90,"code":91,"language":26},[24],"Operating mode. Use 0 or MODE_PRIVATE for the default operation, MODE_WORLD_READABLE and MODE_WORLD_WRITEABLE to control permissions. The bit MODE_MULTI_PROCESS can also be used if multiple processes are mutating the same SharedPreferences file. MODE_MULTI_PROCESS is always on in apps targetting Gingerbread (Android 2.3) and below, and off by default in later versions.\n",[28,93,91],{"__ignoreMap":30},[11,95,96],{},"操作模式是一个bit flag，具体的值对应关系为",[21,98,101],{"className":99,"code":100,"language":26},[24],"MODE_PRIVATE           ---  0000\nMODE_WORLD_READABLE    ---  0001\nMODE_WORLD_WRITEABLE   ---  0010\nMODE_MULTI_PROCESS     ---  0100\n",[28,102,100],{"__ignoreMap":30},[11,104,105],{},"仔细看一下的话就会发现，正如文档所描述的，只有MODE_MULTI_PROCESS这个标识是API Level11之后才有的。这个设定是为了打开配置文件的多进程同时访问功能，大概是随着android版本和对应设备性能的提升才会出现的设计变更。不过大体上程序都不会异步去访问配置，也很少会有多个程序读取相同的配置文件的情况，所以使用的机会比较少。但是既然是bit flag的话，平时就一直设成4就好了。如果想保险起见的话那就先判定一下就好了。",[21,107,110],{"className":108,"code":109,"language":26},[24],"int __sdkLevel = Build.VERSION.SDK_INT;\nSharedPreferences __sp = $context.getSharedPreferences(SETTING_NAME, (__sdkLevel > Build.VERSION_CODES.FROYO) ? 4 : 0);\n",[28,111,109],{"__ignoreMap":30},{"title":30,"searchDepth":41,"depth":42,"links":113},[],{"layout":47,"status":48,"published":49,"author":115,"author_login":51,"author_email":52,"author_url":53,"wordpress_id":116,"wordpress_url":117,"date_gmt":118,"excerpt":119},{"display_name":51,"login":51,"email":52,"url":53},528,"\u002F\u002F?p=528","2012-12-16 04:45:44 +0000",{"type":8,"value":120},[121],[11,122,75],{},"\u002F2012-12-16-android配置类的使用",{"title":70,"description":75},"_legacy\u002F2012\u002F2012-12-16-android%e9%85%8d%e7%bd%ae%e7%b1%bb%e7%9a%84%e4%bd%bf%e7%94%a8",[65,127],"配置类","QU3_1jY3y2TlcZQGJKdq4u7QyopDtP2t8EQ5KaLpKsI",{"id":130,"title":131,"body":132,"date":201,"description":136,"extension":45,"meta":202,"navigation":49,"path":211,"seo":212,"stem":213,"tags":214,"__hash__":215},"blogs\u002F_legacy\u002F2012\u002F2012-11-30-android%e5%ad%a6%e4%b9%a0%e6%80%bb%e7%bb%93.md","Android学习总结",{"type":8,"value":133,"toc":196},[134,137,140,144,147,150,153,181,184,187,190],[11,135,136],{},"历经近一个多月的时间，终于完成了自己的第一个android应用。途中虽然遇到不少纠结和dt的问题，可是现在回头看来却都没有留下什么深刻的印象。",[11,138,139],{},"所以趁着还没有彻底忘记之前把还记得的几处记录一下。",[141,142,143],"h2",{"id":143},"自定义textview的ondraw不触发",[11,145,146],{},"对textview进行定制之后ondraw就没有办法触发了，虽然查了资料据说要调用setWillNotDraw(false)才行。可是就算执行了还是不绘制，最后才发现问题所在。是因为排版的问题导致了textview的高度是0，由于原本设计时是想靠ondraw绘制来占高度的，结果ondraw却没有办法调用。似乎android在高度为0时为了节省资源就不调用绘制函数了。",[141,148,149],{"id":149},"textview的settextsize和gettextsize问题",[11,151,152],{},"这个问题纠结了很久，调试了半天才发现bug所在。textview在对字体进行设置时调用settextsize有好几个不同的传入值类型，目的是为了适应类似retina的功能。就好像px、dp之类的单位，之前一直没有在意过这些。所以就遇到了这个问题，具体的原因是这样的：",[154,155,156,162,165,170,173,178],"blockquote",{},[11,157,158],{},[159,160,161],"strong",{},"public void setTextSize (float size)",[11,163,164],{},"Set the default text size to the given value, interpreted as \"scaled pixel\" units. This size is adjusted based on the current density and user font size preference.",[11,166,167],{},[159,168,169],{},"public void setTextSize (int unit, float size)",[11,171,172],{},"Set the default text size to a given unit and value. See TypedValue for the possible dimension units.",[11,174,175],{},[159,176,177],{},"public float getTextSize ()",[11,179,180],{},"Returns the size (in pixels) of the default text size in this TextView.",[11,182,183],{},"settextsize在设置之后gettextsize的值就会不同，因为gettextsize的unit是pixels，而settextsize的是scaled pixel……",[141,185,186],{"id":186},"canvas的清空问题",[11,188,189],{},"由于是使用的多层绘制，所以canvas在使用时每次都必须清空。找了好久才找到一个不错的方法：",[21,191,194],{"className":192,"code":193,"language":26},[24],"Paint paint = new Paint();\npaint.setXfermode(new PorterDuffXfermode(Mode.CLEAR));\ncanvas.drawPaint(paint);\npaint.setXfermode(new PorterDuffXfermode(Mode.SRC));\n",[28,195,193],{"__ignoreMap":30},{"title":30,"searchDepth":41,"depth":42,"links":197},[198,199,200],{"id":143,"depth":41,"text":143},{"id":149,"depth":41,"text":149},{"id":186,"depth":41,"text":186},"2012-11-30",{"layout":47,"status":48,"published":49,"author":203,"author_login":51,"author_email":52,"author_url":53,"wordpress_id":204,"wordpress_url":205,"date_gmt":206,"excerpt":207},{"display_name":51,"login":51,"email":52,"url":53},518,"\u002F\u002F?p=518","2012-11-30 04:38:18 +0000",{"type":8,"value":208},[209],[11,210,136],{},"\u002F2012-11-30-android学习总结",{"title":131,"description":136},"_legacy\u002F2012\u002F2012-11-30-android%e5%ad%a6%e4%b9%a0%e6%80%bb%e7%bb%93",[65],"_Qyhx1r6UH6d_BALDjSDNmGqz3LWZGq9SwZZEzNhuxs",1788763182745]