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

 

繼《微博尾》之《玩轉尾巴》好玩尾巴積分版傳送門:http://blog.csdn.net/love_5209/article/details/39473983


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

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

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

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

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


微博尾1.0下載地址:http://android.myapp.com/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而已,所以不處理一下返回事件的話,一點返回將退出程序了。如何解決呢?

看下面代碼

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多種,添加個性尾巴,分享功能提供下載地址)

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


感謝您的閱讀~!



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章