分享

! android应用——装逼神器《微博尾》

 看见就非常 2014-11-20
2014-08-25 11:49 31106人阅读 评论(41) 收藏 举报

 

继《微博尾》之《玩转尾巴》好玩尾巴积分版传送门:http://blog.csdn.net/love_5209/article/details/39473983


(本文android新手所做,有疑问或建议请回复~直接回帖或联系新浪微博@请叫我小纯酷

最新版本3.1微博尾下载地址:http://android./myapp/detail.htm?apkName=com.xiaoku.weibowei

学习android也快一个月了,本身有java基础,学起来也比较容易。第一个应用《微博尾》因此诞生了~(作为第一个作品对于本人来说还是比较满意的)

说难不难,简单也不简单(对于新手来说会遇到一些问题的),思路一有了,就开始做了(兴趣所在),做的过程中也遇到很多问题。也慢慢积累了经验。

首先,想法很重要,没有想法都不知从何做起,微博尾这个的想法是从网上浏览无意间看到的,通过修改微博尾,来显示发微博时“来自 xxx手机”的标志,便觉得好玩[土(zhuang)豪(bi)必备],于是开始着手做~~~


微博尾1.0下载地址:http://android./myapp/detail.htm?apkName=com.xiaoku.weibowei  (可下载对照着功能看下面的讲解)


好了,开始了~~~

1、收集微博尾资源,在网上找了很多微博尾的app_src,收集了很多之后就开始了。

2、搭建环境,由于现在的手机android版本都基本4.xx了,故而选择目标版本4.2.2,最小支持版本3.2。

3、开始设计界面布局以及样式等等。


先上张首页图效果如下:



这里,首页布局采用了GridView布局方式,每个Item里面均有一个TextView,每个TextView绑定了一个图片以及文字,专门用于显示手机类型的(大类型,可点击进入小尾巴分类),点击之后显示如下:



这里采用了ListView布局,表面看只有一个TextView,里面其实还隐藏了另一个TextView,用于存放对应的app_src,当点击ListView的某个item时,对应的app_src将被添加到对应要发布微博的URL中,之后点击下面的“微博,走你“按钮,即可到新浪微博发微博,所发的微博也即能显示你所点击的尾巴类型如” 来自 iPhone5s “等~~

总体流程就是这样子。


看起来实现好像没什么难度,其实中间也遇到一些问题,这里稍微讲解一下:


1、首先对于新手来说,很多东西学了不一定能全记住,要养成好的习惯,比如,新建一个Activity就要想到在清单文件AndroidManifest.xml中添加对应的Activity申明。而这个应用需要用到网络,也就得添加相应的网络permission了。


2、上面Gridview对应的每一个item点击进去后显示的ListView,当然不是一个个的Activity了,不然很浪费资源的,可以采用Fragment碎片,灵活又方便。当然,采用了Fragment又会遇到一些问题了。

比如,返回事件,当从主页MainActivity(GridView用一个Fragment包装)跳到ListView(一个Fragment),此时还是MainActivity,只不过换了个Fragment而已,所以不处理一下返回事件的话,一点返回将退出程序了。如何解决呢?

看下面代码

  1. Fragment selectPhoneFragment = new SelectPhoneFragment();  
  2.         FragmentTransaction transaction = getFragmentManager().beginTransaction();  
  3.           
  4.         Bundle bundle = new Bundle();  
  5.         bundle.putString("phoneName", PHONE_NAME[position]);  
  6.         selectPhoneFragment.setArguments(bundle);  
  7.           
  8.         transaction.replace(R.id.main_fragment,selectPhoneFragment);  
  9.         transaction.addToBackStack(null);  
  10.         transaction.commitAllowingStateLoss();  

transaction.addToBackStack(null);这句是关键,将当前的Activity添加到栈中,返回时即可显示刚刚那个Activity。


3、17个手机产商,我直接就存放在String数组中了,以及对应的图片drawable ID,后续可使用面向对象的方式存放。但是,70多个微博尾,如何存放呢?刚开始想了存放在Sqlite数据库中,后来想想还是不习惯使用Sqlite,于是,就采用了properties工具类来存储了。工具代码如下:

  1. package com.xiaoku.weibowei.util;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.InputStream;  
  5. import java.util.Properties;  
  6. /** 
  7.  * 读取property文件 
  8.  */  
  9.   
  10. @SuppressWarnings("serial")  
  11. public class FileUtil implements java.io.Serializable{  
  12.     private Properties prop ;  
  13.     private InputStream is ;  
  14.   
  15.     public FileUtil(String filename)  
  16.     {  
  17.        prop = new Properties() ;  
  18.        is = getClass().getResourceAsStream("/assets/"+filename);  
  19.        try {  
  20.            prop.load(is);  
  21.            if(is!=null)  
  22.               is.close();  
  23.        } catch (IOException e) {  
  24.            System.out.print(e.getMessage()) ;  
  25.            e.printStackTrace();  
  26.        }  
  27.     }  
  28.   
  29.     //取得属性  
  30.     public String getProperties(String PropertyName)  
  31.     {  
  32.         return prop.getProperty(PropertyName);  
  33.     }  
  34. }  

从上面的代码可以看到,我存放的property文件是放在assets目录下的。

于是,我就可以在property文件中存放对应的手机以及对应微博尾键值对了。键为手机商,值为多个尾巴组合起来。如:华为=荣耀6的尾巴#荣耀6&荣耀3C的尾巴#荣耀3C

取出来之后在按照&划分,之后再按照#划分,便可取到对应尾巴的app_src了。


4、刚刚前面说过的fragment还有一个问题,就是横竖屏的时候会出错,比如MainActivity(里面的一个fragment手机产商,记为MainFragment),点击某个手机产商,调到另一个fragment,此时还在MainActivity,如果切换横竖屏的话,就会出现跳回MainFragment界面。原因是横竖屏切换的话默认会导致Activity从新调用onCreate方法一次,也就是会显示了MainFragment手机产商界面。可在清单文件配置如下:

  1. <activity android:name="com.xiaoku.weibowei.MainActivity"  android:configChanges="orientation|keyboardHidden|keyboard|screenSize"></activity>  

然后在MainActivity中重写一下onConfigurationChanged方法(这里我就没处理了):

  1. //横竖屏切换  
  2.     @Override  
  3.     public void onConfigurationChanged(Configuration newConfig) {  
  4.         /*if(newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE){ 
  5.             Toast.makeText(getApplicationContext(), "横屏", Toast.LENGTH_LONG).show(); 
  6.         }else{ 
  7.             Toast.makeText(getApplicationContext(), "竖屏", Toast.LENGTH_LONG).show(); 
  8.         }*/  
  9.         super.onConfigurationChanged(newConfig);  
  10.     }  


5、关于2次返回按钮退出时显示吐丝”再按一次退出程序“的做法,其实也很简单,只需在MainActivity中重写一下onKeyDown,里面做一下判断

  1. //2次返回退出应用  
  2.     @Override  
  3.     public boolean onKeyDown(int keyCode, KeyEvent event) {  
  4.         if (keyCode == KeyEvent.KEYCODE_BACK) {  
  5.             if (this.getFragmentManager().getBackStackEntryCount() == 0) {//最后一个fragment即主页~  
  6.                 if ((System.currentTimeMillis() - mExitTime) > 2000) {  
  7.                      Toast.makeText(this, "再按一次退出程序", Toast.LENGTH_SHORT).show();  
  8.                      mExitTime = System.currentTimeMillis();  
  9.                 }else {  
  10.                     finish();  
  11.                 }  
  12.             return true;  
  13.             }  
  14.         }  
  15.         return super.onKeyDown(keyCode, event);  
  16.     }  
  1. </pre>这里的【 if (this.getFragmentManager().getBackStackEntryCount() == 0) {//最后一个fragment即主页~ 】   也比较关键,因为使用了fragment,不然在ListViewFragment(也就是选择具体某个手机型号的界面)里面点击返回也会执行这一个,不做这段处理的话,也会显示”再按一次退出程序“。<p></p><p></p><p>6、关于菜单按钮(右上角三个点),可能是由于版本问题,有些地方显示不了,可在MainActivity中的onCreate方法做以下处理:</p><p></p><pre name="code" class="java">//显示三个点菜单  
  2.         try {    
  3.             ViewConfiguration config = ViewConfiguration.get(this);    
  4.             Field menuKeyField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey");    
  5.             if(menuKeyField != null) {    
  6.                 menuKeyField.setAccessible(true);    
  7.                 menuKeyField.setBoolean(config, false);    
  8.             }    
  9.         } catch (Exception e) {    
  10.             e.printStackTrace();    
  11.         }   


在菜单”关于“按钮显示对应的页面中,显示作者信息等等那一个页面,横竖屏切换遇到了下面的字看不到了,原因就是没有设置滚动条,可在对应的Layout中添加ScrollView包裹你要滚动的视图。

  1. <ScrollView xmlns:android="http://schemas./apk/res/android"  
  2.     android:layout_width="fill_parent"   
  3.     android:layout_height="fill_parent"  
  4.     android:scrollbars="vertical">  
  5.   
  6. 包裹要滚动的视图  
  7.   
  8. </ScrollView>  

在菜单”图解“按钮中,其实也就是初始安装显示的引导页面,使用的是ViewFilpper, 可参考http://blog.csdn.net/love_5209/article/details/38516233

里面又涉及到横竖屏切换问题,一横屏,显示的图片不是很好看,故而应该设置只允许竖屏显示,可在清单文件配置对应的Activity:

  1. <activity android:name="com.xiaoku.weibowei.ViewFlipperActivity" android:screenOrientation="nosensor">  
参数还有其他,大家可以研究研究~


7、点击”微博,走你“按钮之后,跳到另一个Activity,这里采用了WebView来访问传过来的URL值,默认不做处理的话,访问后会出现可以访问新浪微博,但是点击不了里面的按钮之类的,返回也没有直接在浏览器返回(不管你点了多少个页面,一点返回直接跳回ListViewFragment页面),故需要做一下处理如下:

  1. @SuppressLint({ "SetJavaScriptEnabled", "SdCardPath" })  
  2.     @Override  
  3.     public void onViewCreated(View view, Bundle savedInstanceState) {  
  4.         super.onViewCreated(view, savedInstanceState);  
  5.         String url = (String) getArguments().get("url");//接收传过来的URL  
  6.         webView = (WebView) getActivity().findViewById(R.id.webview);  
  7.           
  8.         //点击后退按钮,让WebView后退一页(也可以覆写Activity的onKeyDown方法)    
  9.         webView.setOnKeyListener(new View.OnKeyListener() {    
  10.             @Override  
  11.             public boolean onKey(View v, int keyCode, KeyEvent event) {  
  12.                 if (event.getAction() == KeyEvent.ACTION_DOWN) {    
  13.                     if (keyCode == KeyEvent.KEYCODE_BACK && webView.canGoBack()) {  
  14.                         webView.goBack();   //后退    
  15.                         //webview.goForward();//前进  
  16.                         return true;    //已处理    
  17.                     }  
  18.                 }  
  19.                 return false;    
  20.             }  
  21.         });  
  22.   
  23.         //设置浏览器可用  
  24.         WebSettings s = webView.getSettings();  
  25.         s.setBuiltInZoomControls(true);  
  26.         s.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);  
  27.         s.setUseWideViewPort(true);  
  28.         s.setLoadWithOverviewMode(true);  
  29.         s.setSavePassword(true);  
  30.         s.setSaveFormData(true);  
  31.         s.setJavaScriptEnabled(true);  
  32.         // enable navigator.geolocation       
  33.         s.setGeolocationEnabled(true);  
  34.         s.setGeolocationDatabasePath("/data/data/com.xiaoku.weibowei/databases/");   
  35.         // enable Web Storage: localStorage, sessionStorage       
  36.         s.setDomStorageEnabled(true);  
  37.         webView.requestFocus();    
  38.         webView.setScrollBarStyle(0);  
  39.           
  40.         webView.setWebViewClient(new WebViewClient(){  
  41.             @Override  
  42.             public boolean shouldOverrideUrlLoading(WebView view,  
  43.                     String url) {  
  44.                 view.loadUrl(url);  
  45.                 return true;  
  46.             }  
  47.         });//自定义浏览器  
  48.         webView.loadUrl(url);  
  49.         Toast.makeText(getActivity(), "加载网页,请稍等...", Toast.LENGTH_LONG).show();  
  50.     }  

除了以上这些,其实还有其他的一些功能,比如进入ListViewFragment,listView滑动的效果;软件初始显示图解,之后点击直接进入主页;嵌入插屏广告;分享功能等等。


对于源码目前暂不提供,有问题可回帖交流


微博尾2.0版本已完工,9月份初上线。(版本预告:尾巴达90多种,添加个性尾巴,分享功能提供下载地址)

微博尾下载地址:http://android./myapp/detail.htm?apkName=com.xiaoku.weibowei


感谢您的阅读~!

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约