visited 13 states (5.77%)
Create your own visited map of The World or Triposo world travel guide for Android

2014-11-28

Andorid軟體中設定TabHost的字體與樣式

在開發多個tab頁面的應用程式時,可能需要對每個tab的標籤做些修改,以下是相關的程式
import java.lang.reflect.Field;
import android.app.Activity;
import android.os.Build;
import android.R;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.TabHost;
import android.widget.TabWidget;
import android.widget.TextView;
import android.widget.TabHost.OnTabChangeListener;
public class TabTest2 extends Activity {
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(com.TabTest2.R.layout.main);
final TabHost tabs=(TabHost)findViewById(com.TabTest2.R.id.tabhost);
final TabWidget tabWidget=(TabWidget) findViewById(R.id.tabs);
int width =45;
int height =48;
Field mBottomLeftStrip;
Field mBottomRightStrip;
tabs.setup();



tabs.addTab(tabs.newTabSpec("first tab")
.setIndicator("news",getResources().getDrawable(com.TabTest2.R.drawable.c))
.setContent(com.TabTest2.R.id.tab1));
tabs.addTab(tabs.newTabSpec("second tab")
.setIndicator("help",getResources().getDrawable(com.TabTest2.R.drawable.e))
.setContent(com.TabTest2.R.id.tab2));
tabs.addTab(tabs.newTabSpec("third tab")
.setIndicator("setting",getResources().getDrawable(com.TabTest2.R.drawable.efg))
.setContent(com.TabTest2.R.id.tab2));

tabs.setCurrentTab(0);


for (int i =0; i /**
* 設置高度、寬度,不過寬度由於設置為fill_parent,在此對它沒效果 */ tabWidget.getChildAt(i).getLayoutParams().height = height; tabWidget.getChildAt(i).getLayoutParams().width = width; /** * 設置tab中標題文字的顏色,不然預設為黑色 */ final TextView tv = (TextView) tabWidget.getChildAt(i).findViewById(android.R.id.title); tv.setTextColor(this.getResources().getColorStateList(android.R.color.white)); /** * 此方法是為了去掉系統預設的色白的底角 * * 在 TabWidget中mBottomLeftStrip、mBottomRightStrip * 私有變數,可以通過反射來獲取 * * **/ if (Float.valueOf(Build.VERSION.RELEASE) <= 2.1) { try { mBottomLeftStrip = tabWidget.getClass().getDeclaredField ("mBottomLeftStrip"); mBottomRightStrip = tabWidget.getClass().getDeclaredField ("mBottomRightStrip"); if(!mBottomLeftStrip.isAccessible()) { mBottomLeftStrip.setAccessible(true); } if(!mBottomRightStrip.isAccessible()){ mBottomRightStrip.setAccessible(true); } mBottomLeftStrip.set(tabWidget, getResources().getDrawable (com.TabTest2.R.drawable.linee)); mBottomRightStrip.set(tabWidget, getResources().getDrawable (com.TabTest2.R.drawable.linee)); } catch (Exception e) { e.printStackTrace(); } } else { } View v = tabWidget.getChildAt(i); if(tabs.getCurrentTab()==i){ v.setBackgroundDrawable(getResources().getDrawable(com.TabTest2.R.drawable.shine)); } else { v.setBackgroundDrawable(getResources().getDrawable(com.TabTest2.R.drawable.seven)); } } /** * 當點擊tab選項的時候,更改當前的背景 */ tabs.setOnTabChangedListener(new OnTabChangeListener(){ @Override public void onTabChanged(String tabId) { // TODO Auto-generated method stub for (int i =0; i < tabWidget.getChildCount(); i++) { View v = tabWidget.getChildAt(i); if(tabs.getCurrentTab()==i){ v.setBackgroundDrawable(getResources().getDrawable(com.TabTest2.R.drawable.shine)); } else { v.setBackgroundDrawable(getResources().getDrawable(com.TabTest2.R.drawable.seven)); } } }}); } }
也可以用這種方式
TabHost tabHost = getTabHost();
for(int i=0;i<tabhost.getTabWidget().getChildCount();i++) 
        { 
            TextView tv = (TextView) tabhost.getTabWidget().getChildAt(i).findViewById(android.R.id.title); //Unselected Tabs
            tv.setTextColor(Color.parseColor("#ffffff"));
        } 
        TextView tv = (TextView) tabhost.getCurrentTabView().findViewById(android.R.id.title); //for Selected Tab
        tv.setTextColor(Color.parseColor("#000000"))

2014-11-04

Java語言中 static / final 基本用法

static:

可以用來宣告一個函數或者變數,當一個函數或者變數被宣告為static時,

就具有唯一值的概念。此函數或變數永遠只佔著一組記憶體空間。不管該類別被new幾個object,

該值永遠都會是一樣的。

class test{
     static int iValue = 0;
     public test() {
     }
}
public class main {
     public static void main(String[] argv)  {
          test test1 = new test();
          test test2 = new test();
          System.out.println(test1.iValue);
          test2.iValue  = 10;
          System.out.println(test2.iValue);
          System.out.println(test1.iValue);
     }
}

當test這個類別裡的資料成員iValue被宣告為static型態, 

在main function裡面分別去new兩個object出來。 分別是test1, test2,

先印出test1的iValue出來(印出0,初始值是0), 

接著我們在test2這個object去將iValue設值設為10,

再去印出test2的iValue出來(此時會印出10), 

這時候再印出test1的iValue出來會發現印出的是10。 

原因是因為我們將iValue宣告成static了。而iValue成為一個共同的變數。 

這就是static 的一個特性,

特性一:永遠會是一個唯一值!

且static 還有一個特性,

特性二:static可以透過類別直接存取使用!

意思是我們其實不需要new 一個object出來。

也可以透過類別直接去存取該變數
class test{
     static int iValue = 0;
     public test() {
     }
}
public class main {
     public static void main(String[] argv)  {
          System.out.println(test.iValue);
     }
}

在main中,並沒有new一個object出來,也可以存取到test這個類別中的資料成員(iValue)

final: 相較於static,final的概念就容易了解許多。

可以用來宣告一個類別、函數、或者變數。 

類別:當宣告在類別上時,該類別就無法被繼承。

函數:當一個函數被宣告為final時,則繼承他的子類別無法覆寫 

變數:當一個變數被宣告為final時,意思是他是一個常數,是無法被修改的。 

使用static final需要注意一點,如上面所述說的,當我們有一個常數要宣告時, 

會宣告如下

public static final String strValue = "abc";

為什麼宣告這樣會有個風險呢?

因為java在進行compile的時候, 會將宣告成static final的變數,直接包進去程式裡面。 

System.out.println(strValue);

當你有類似存取strValue的code時,我們去把java會把compile成的class,decompile來看,

會發現它變成如下的code

System.out.println("abc");

風險在於若不是用易除邊譯除錯的IDE來寫程式,

有可能會誤將strValue的值改為"123"或其他值, 若忘了重新compile,

有其他物件去存取strValue就會發生錯誤。

我們可以利用static block來進行宣告的動作,如下:

static String strValue;
static{
     strValue = "abc";
}

如果用這樣的宣告方式,即可避免上面述說的問題!

private / protected / public 存取修飾詞說明

在說明這四個關鍵字之前,我想就class之間的關係做一個簡單的定義,對於繼承自己的class,base class可以認為他們都是自己的子女,而對於和自己一個目錄下的classes,認為都是自己的朋友。
private, protected, public 為C++類別中的存取設定
其用法如下

private
private宣告的函式或變數 只能由自己類別所使用
不能由外部使用 連繼承自己的類別也不能使用
以下為合法使用法
class A
{
private:
  bool m_bFlag;
public:
  void pub_funA()
  {
    m_bFlag = true;
  };
}
承上 以下為錯誤使用法
class B : public A
{
public:
  void pub_funB()
  {
    m_bFlag = false;
  };
}
類別B繼承A但仍舊不能使用其private成員
以下也是錯誤的
A obj_a;
obj_a.m_bFlag = false;


protected
protected 就比 private 鬆了一點 繼承類別准許存取 protected 成員 但外部使用仍然禁止
以下為合法使用法
class C
{
protected:
  int m_nValue;
}

class D : public C
{
public:
  void pub_funC()
  {
    m_nValue = 0;
  };
}
以下這樣用是錯誤的
C obj_c;
obj_c.m_nValue = 1;
當然下面這樣也是錯的
C *pobj_c;
pobj_c->m_nValue = 1;


public
public就不用說了 就是怎麼用都可以 
作用域   當前類 同一package 子孫類 其他package
public     OK    OK    OK      OK
protected     OK    OK       OK     x
friendly      OK    OK     ×        x
private    OK     ×       ×    
不寫時默認為friendly