1. 程式人生 > >我的第一個android應用——裝逼神器《微博尾》

我的第一個android應用——裝逼神器《微博尾》


(本文android新手所做,有疑問或建議請回復~直接回帖或聯絡新浪微博@請叫我小純酷

學習android也快一個月了,本身有java基礎,學起來也比較容易。第一個應用《微博尾》因此誕生了~(作為第一個作品對於本人來說還是比較滿意的)

說難不難,簡單也不簡單(對於新手來說會遇到一些問題的),思路一有了,就開始做了(興趣所在),做的過程中也遇到很多問題。也慢慢積累了經驗。

首先,想法很重要,沒有想法都不知從何做起,微博尾這個的想法是從網上瀏覽無意間看到的,通過修改微博尾,來顯示發微博時“來自 xxx手機”的標誌,便覺得好玩[土(zhuang)豪(bi)必備],於是開始著手做~~~

好了,開始了~~~

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而已,所以不處理一下返回事件的話,一點返回將退出程式了。如何解決呢?

看下面程式碼

Fragment selectPhoneFragment = new SelectPhoneFragment();
        FragmentTransaction transaction = getFragmentManager().beginTransaction();
        
        Bundle bundle = new Bundle();
        bundle.putString("phoneName", PHONE_NAME[position]);
        selectPhoneFragment.setArguments(bundle);
        
        transaction.replace(R.id.main_fragment,selectPhoneFragment);
        transaction.addToBackStack(null);
        transaction.commitAllowingStateLoss();

transaction.addToBackStack(null);這句是關鍵,將當前的Activity新增到棧中,返回時即可顯示剛剛那個Activity。

3、17個手機產商,我直接就存放在String陣列中了,以及對應的圖片drawable ID,後續可使用面向物件的方式存放。但是,70多個微博尾,如何存放呢?剛開始想了存放在Sqlite資料庫中,後來想想還是不習慣使用Sqlite,於是,就採用了properties工具類來儲存了。工具程式碼如下:

package com.xiaoku.weibowei.util;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
/**
 * 讀取property檔案
 */

@SuppressWarnings("serial")
public class FileUtil implements java.io.Serializable{
    private Properties prop ;
    private InputStream is ;

    public FileUtil(String filename)
    {
       prop = new Properties() ;
       is = getClass().getResourceAsStream("/assets/"+filename);
       try {
           prop.load(is);
           if(is!=null)
              is.close();
       } catch (IOException e) {
           System.out.print(e.getMessage()) ;
           e.printStackTrace();
       }
    }

    //取得屬性
    public String getProperties(String PropertyName)
    {
		return prop.getProperty(PropertyName);
	}
}

從上面的程式碼可以看到,我存放的property檔案是放在assets目錄下的。

於是,我就可以在property檔案中存放對應的手機以及對應微博尾鍵值對了。鍵為手機商,值為多個尾巴組合起來。如:華為=榮耀6的尾巴#榮耀6&榮耀3C的尾巴#榮耀3C

取出來之後在按照&劃分,之後再按照#劃分,便可取到對應尾巴的app_src了。

4、剛剛前面說過的fragment還有一個問題,就是橫豎屏的時候會出錯,比如MainActivity(裡面的一個fragment手機產商,記為MainFragment),點選某個手機產商,調到另一個fragment,此時還在MainActivity,如果切換橫豎屏的話,就會出現跳回MainFragment介面。原因是橫豎屏切換的話預設會導致Activity從新呼叫onCreate方法一次,也就是會顯示了MainFragment手機產商介面。可在清單檔案配置如下:

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

然後在MainActivity中重寫一下onConfigurationChanged方法(這裡我就沒處理了):
//橫豎屏切換
	@Override
    public void onConfigurationChanged(Configuration newConfig) {
        /*if(newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE){
        	Toast.makeText(getApplicationContext(), "橫屏", Toast.LENGTH_LONG).show();
        }else{
        	Toast.makeText(getApplicationContext(), "豎屏", Toast.LENGTH_LONG).show();
        }*/
        super.onConfigurationChanged(newConfig);
    }


5、關於2次返回按鈕退出時顯示吐絲”再按一次退出程式“的做法,其實也很簡單,只需在MainActivity中重寫一下onKeyDown,裡面做一下判斷

//2次返回退出應用
	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		if (keyCode == KeyEvent.KEYCODE_BACK) {
			if (this.getFragmentManager().getBackStackEntryCount() == 0) {//最後一個fragment即主頁~
				if ((System.currentTimeMillis() - mExitTime) > 2000) {
	                 Toast.makeText(this, "再按一次退出程式", Toast.LENGTH_SHORT).show();
	                 mExitTime = System.currentTimeMillis();
				}else {
	                finish();
				}
			return true;
			}
		}
		return super.onKeyDown(keyCode, event);
	}
</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">//顯示三個點選單
        try {  
            ViewConfiguration config = ViewConfiguration.get(this);  
            Field menuKeyField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey");  
            if(menuKeyField != null) {  
                menuKeyField.setAccessible(true);  
                menuKeyField.setBoolean(config, false);  
            }  
        } catch (Exception e) {  
            e.printStackTrace();  
        } 
在選單”關於“按鈕顯示對應的頁面中,顯示作者資訊等等那一個頁面,橫豎屏切換遇到了下面的字看不到了,原因就是沒有設定滾動條,可在對應的Layout中新增ScrollView包裹你要滾動的檢視。
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"
    android:scrollbars="vertical">

包裹要滾動的檢視

</ScrollView>

在選單”圖解“按鈕中,其實也就是初始安裝顯示的引導頁面,使用的是ViewFilpper, 可參考http://blog.csdn.net/love_5209/article/details/38516233

裡面又涉及到橫豎屏切換問題,一橫屏,顯示的圖片不是很好看,故而應該設定只允許豎屏顯示,可在清單檔案配置對應的Activity:

<activity android:name="com.xiaoku.weibowei.ViewFlipperActivity" android:screenOrientation="nosensor">
引數還有其他,大家可以研究研究~

7、點選”微博,走你“按鈕之後,跳到另一個Activity,這裡採用了WebView來訪問傳過來的URL值,預設不做處理的話,訪問後會出現可以訪問新浪微博,但是點選不了裡面的按鈕之類的,返回也沒有直接在瀏覽器返回(不管你點了多少個頁面,一點返回直接跳回ListViewFragment頁面),故需要做一下處理如下:

@SuppressLint({ "SetJavaScriptEnabled", "SdCardPath" })
	@Override
	public void onViewCreated(View view, Bundle savedInstanceState) {
		super.onViewCreated(view, savedInstanceState);
		String url = (String) getArguments().get("url");//接收傳過來的URL
		webView = (WebView) getActivity().findViewById(R.id.webview);
		
		//點選後退按鈕,讓WebView後退一頁(也可以覆寫Activity的onKeyDown方法)  
        webView.setOnKeyListener(new View.OnKeyListener() {  
			@Override
			public boolean onKey(View v, int keyCode, KeyEvent event) {
				if (event.getAction() == KeyEvent.ACTION_DOWN) {  
                    if (keyCode == KeyEvent.KEYCODE_BACK && webView.canGoBack()) {
                        webView.goBack();   //後退  
                        //webview.goForward();//前進
                        return true;    //已處理  
                    }
                }
                return false;  
			}
        });

		//設定瀏覽器可用
		WebSettings s = webView.getSettings();
		s.setBuiltInZoomControls(true);
		s.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);
		s.setUseWideViewPort(true);
		s.setLoadWithOverviewMode(true);
		s.setSavePassword(true);
		s.setSaveFormData(true);
		s.setJavaScriptEnabled(true);
		// enable navigator.geolocation     
		s.setGeolocationEnabled(true);
		s.setGeolocationDatabasePath("/data/data/com.xiaoku.weibowei/databases/"); 
		// enable Web Storage: localStorage, sessionStorage     
		s.setDomStorageEnabled(true);
		webView.requestFocus();  
		webView.setScrollBarStyle(0);
		
		webView.setWebViewClient(new WebViewClient(){
			@Override
			public boolean shouldOverrideUrlLoading(WebView view,
					String url) {
				view.loadUrl(url);
				return true;
			}
		});//自定義瀏覽器
		webView.loadUrl(url);
		Toast.makeText(getActivity(), "載入網頁,請稍等...", Toast.LENGTH_LONG).show();
	}

除了以上這些,其實還有其他的一些功能,比如進入ListViewFragment,listView滑動的效果;軟體初始顯示圖解,之後點選直接進入主頁;嵌入插屏廣告;分享功能等等。

對於原始碼目前暫不提供,有問題可回帖交流

微博尾2.0版本已完工,9月份初上線。(版本預告:尾巴達90多種,添加個性尾巴,分享功能提供下載地址)

感謝您的閱讀~!