我的第一個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多種,添加個性尾巴,分享功能提供下載地址)
感謝您的閱讀~!