2016年11月30日 星期三
Android 自定義 Dilog error 問題
FATAL EXCEPTION: main
Process: com.rich.app.designeddriver.user, PID: 23435
android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
at android.view.ViewRootImpl.setView(ViewRootImpl.java:600)
at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:310)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:85)
問題解決
不能使用getApplicationContext()得到的context,而必须使用Activity,所以解决如下
android EditText 限制字數 顯示數字鍵盤
首先设置只能输入数字
<EditText
android:id="@+id/edit_digit_input"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:digits="1234567890."
android:singleLine="true"
/>
重点是
android:digits="1234567890."
EditText中android:digits属性的作用
是设置允许输入哪些字符。如“1234567890.+-*/%\n()”
再在代码里面设置输入法类型:
editText.setInputType(EditorInfo.TYPE_CLASS_PHONE);
则如果该EditText获得焦点,会弹出数字输入法的模拟键盘
以EditText這個View為例,如果要限制EditText輸入文字的最大長度,可以設定它的「maxLength」屬性。在XML下,可以替EditText加入這個屬性,並指定最大的文字長度。如下面的XML語法,將EditText的可輸入的最大字元數量限制在10個:
1
2
3
4
|
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:maxLength="10" />
|
如果要用Android SDK的Java程式來寫,會比較麻煩一點,可以寫成這樣:
1
|
editText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(10)});
|
2016年11月29日 星期二
Android 設置dialog背景全透明無邊框的最簡單的方法
做dialog的全透明無邊框背景,網上找了n久,都有問題,其實很簡單,就兩句搞定。
<style name="Translucent_NoTitle" parent="android:style/Theme.Dialog"> <item name="android:background">#00000000</item> <!-- 設置自定義佈局的背景透明--> <item name="android:windowBackground">@android:color/transparent</item> <!-- 設置window背景透明,也就是去邊框--> </style>
其他的都可以不用設置,有些屬性會繼承下來,唯一一個沒被繼承的是 <item name=" android:windowIsTranslucent ">true</item>,這個不設置也沒影響
此方法同樣可以用於activity,設置activity半透明
res/values/ styles.xml <resources> <style name="Transparent "> <item name="android:windowBackground">@color/transparent_background</item> <item name="android:windowNoTitle"> true </item> <item name="android:windowIsTranslucent"> true </item> <item name="android:windowAnimationStyle">@+android:style/Animation.Translucent</item> </style> </resources>
res/values/ color.xml <?xml version="1.0" encoding="utf-8"?> <resources> <color name="transparent_background">#50000000</color> </resources>
注意:color.xml的#5000000前兩位是透明的效果參數從00--99(透明--不怎麼透明),後6位是顏色的設置
manifest.xml <activity android:name=".TransparentActivity" android:theme="@style/Transparent"> </activity>
【教學】Android Dialog 的 Layout 透明化教學
大家在開發 App 時,是否想設計一個自己專屬的 Dialog ,把 Dialog 的背景變成透明呢?
別急別急~
僅需四個步驟就能達成願望囉!
讓我們來瞧瞧該怎麼做吧!
首先你要先準備一份你自己設計的 Dialog 背景圖,本文背景圖的名稱為 dialog_bg.png,切記如果不想風格只有四四方方的話,一定要用 png 檔,這樣才能使你的 Dialog 不再是四方形。
接著是設定 Dialog 的風格,你在 drawable 中建置一份 xml ,名稱可以自訂,本文文件為 selector_dialog_bg.xml ,若沒有 drawable 的資料夾,則自己創建一份即可。
路徑:res/drawable/selector_dialog_bg.xml<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"><!--形狀--> <!--內容--> <solid android:color="#00000000"/> <!--邊框--> <stroke android:width="5dp" android:color="#0099CC33" /> <!--內容物件的距離--> <padding android:left="5dp" android:top="5dp" android:right="5dp" android:bottom="5dp" /> <!--框角矩形的程度--> <corners android:radius="5dp" /> </shape>
再來是設定 Dialog layout 的風格,你要在一份叫 styles.xml 的文件中進行編輯,而編輯的內容與功能依照下方指令設定即可。
路徑:res/values/styles.xml<style name="selectorDialog" parent="@android:style/Theme.Dialog"> <!-- 邊框 --> <item name="android:windowFrame">@null</item> <!-- 是否浮现在activity之上 --> <item name="android:windowIsFloating">true</item> <!-- 整個 layout 半透明 --> <item name="android:windowIsTranslucent">true</item> <!-- 拿掉標題 --> <item name="android:windowNoTitle">true</item> <!-- 背景透明 --> <item name="android:windowBackground">@drawable/selector_dialog_bg</item> <!-- 由 XML 設定 Dialog 視窗是否變暗 --> <item name="android:backgroundDimEnabled">true</item> <!-- 亮度從 0 到 1.0 --> <item name="android:backgroundDimAmount">0.2</item> </style>
來到 layout 的部分,裡頭的 xml 有兩份,一份為進到 Activity 時對應的 xml ,一份則為呼叫 Dialog 時對應的 xml ,本文分別為 activity_dialog_bg02.xml 與 dialog_mod.xml 。
路徑:res/layout/activity_dialog_bg02.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#00ffff" > <Button android:id="@+id/btn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:text="Show dialog" /> <TextView android:layout_width="200dp" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:text="Activity word is blue." android:textColor="#0000ff" android:textSize="50dp" /> </RelativeLayout>
路徑:res/layout/dialog_mod.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/dialog_bg" > <TextView android:layout_width="230dp" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:layout_marginTop="100dp" android:text="Dialog word is red." android:textColor="#ff0000" android:textSize="40dp" /> </RelativeLayout>
最後來到程式的部分囉!在這個部份我們將會對物件進行實體化,並且進行操作設定。
名稱:DialogBG02@SuppressLint("NewApi") public class DialogBG02 extends Activity { private Button btn_show; private Dialog dialog; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_dialog_bg02); btn_show = (Button) this.findViewById(R.id.btn); btn_show.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // 設定模組與 Dialog 的風格 dialog = new Dialog(DialogBG02.this, R.style.selectorDialog); dialog.setContentView(R.layout.dialog_mod); // 由程式設定 Dialog 視窗外的明暗程度, 亮度從 0f 到 1f WindowManager.LayoutParams lp=dialog.getWindow().getAttributes(); lp.dimAmount=0.2f; dialog.getWindow().setAttributes(lp); dialog.show(); } }); } }
Android 圓角 寫法
在做Android界面開發時,我們往往希望它盡可能優美,盡可能顯得專業。於是你看了看其他應用,哇,好多邊框和圓角啊。你是不是也想給自己的應用加上邊框和圓角效果?呃……那怎麼做呢?如果你是從web前端跑到Android來的,那麼我想你一定想到了不下三種解決方案。如用圖片替代,用CSS3定義,用JS畫。在Android中,其實也有類似的用法,本文將簡單介紹兩種Android圓角和邊框的實現。
1 圖片
在Android中,給一個控件(或View)設置背景主要是通過
background:xxx
屬性來完成。background的參數一般來說是一個drawable資源。drawable可以是一張普通的圖片,也可以是9 patch圖片,還可以是一個xml文件。給控件設置邊框最簡單的方式就是把background設置成你預先設計好的帶圓角和邊框的背景圖。比如下面這張圖:
但是,你很快會發現一個缺點:靈活性很差!是的,固定大小的圖片很難根據控件裡的內容而調整大小。它在被做出來的那天就已經被確定了!換句話說,你很難只用這一張圖來應付擁有相同風格卻大小各異的控件。為了給所有控件加上圓角和邊框,你必須小心翼翼地計算他們的大小,然後一個一個得製作背景圖片!天哪,這簡直太愚蠢了。一旦遇到大小不定的控件,這方法就歇菜了。而且,大量的背景圖片會讓你的安裝包迅速膨脹。呃……還有,你怎麼應對擁有各式各樣分辨率的Android設備呢?
所以,你需要……換個方法。
使用9 patch圖片有很多好處,如減輕美工壓力,減少UI代碼量,減少內存使用……總結起來就是:省時省力,屌爆了。
所以在給圓角和邊框時,你或許會這麼做。
當然,9 patch能做的是遠遠比這多,如做一個自適應的對話框什麼的。
2 XML定義
我想大多數程序員都喜歡用代碼解決問題。原因如下:
- 用代碼更加cool。
- 我美工不行,我會說出去嗎?
OK,好東西在這裡。
2.1 基本的圓角、邊框
Android除了支持原始的圖片資源外,比較棒的一點就是可以用XML文件定義一些簡單的圖形。這有點像web的CSS,不過相比CSS3,Android的xml實現還沒那麼強大,例如,邊框要么四周都有,要么四周都沒有(我們將在後面討論這事)。xml drawable的傳送門在這裡。
要畫一個帶灰色邊框和圓角的圖形很容易,在drawable資源目錄下添加一個xml:
<?xml version="1.0" encoding="utf-8"?>
<!-- shape如果不声明形状则默认为正方形 -->
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
<corners android:radius="5.0dp" />
<!-- 圆角,你也可以对不同的角设置不同的数值 -->
<solid android:color="#FFFFFF" />
<!-- 形状的填充色 -->
<stroke
android:width="1dp"
android:color="#CCCCCC" />
<!-- 边框宽度和颜色 -->
</shape>
在你需要用到這東西的地方如某個View下,設置background就行了。
2.2 “自由的邊框“
當前版本的Android SDK並沒有給stroke提供bottom、left、right之類的屬性,也就是說你無法通過它來讓長方形的邊框少於4條。啊,真是太遺憾了。怎麼辦呢?有人想到了對Layer List hack。在StackOverflow上有不少這樣的把戲。
為了實現只有left,right和top邊框,我們可以這麼寫:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item>
<shape android:shape="rectangle" >
<stroke
android:width="1dp"
android:color="@color/card_stroke" />
</shape>
</item>
<item
android:left="2dp"
android:right="2dp"
android:top="2dp">
<!-- 在实际使用中我发现1dp达不到显示效果,而2dp正好可以显示边框 -->
<shape android:shape="rectangle" >
<solid android:color="@color/solid_white" />
</shape>
</item>
</layer-list>
原理差不多是這樣:
詭異的是理論上只要偏移量只要1dp就能顯示1dp寬帶邊框了,但我在listview裡實驗了一下發現不行,換成2dp方可。有同學能解釋解釋麼?
如果要給圖形加上圓角,只需要給每個shape加上
<corners
android:topLeftRadius="5.0dip"
android:topRightRadius="5.0dip" />
值得注意的是,兩個shape的radius在設置的時候請確保前面的圖層不會把後面的擋住。
3 小結
要在Android中實現圓角和邊框,比較簡單的方法:圖片、XML差不多就是這麼用的啦。此外還有用Java代碼調用draw方法畫出來的,不過我沒有研究過。他們各有各的優點啦。用圖片,能控制的東西更多,用代碼修改起來比較另過。最後要說的是兩個方法的效率。在這個問題上,我留有疑問,沒有做過專門的比較。但直觀的感受是……好吧,沒什麼感受。
每一個用Linerlayout就行,至於圓角框樣式用xml配置一下,裡面的橫線imageView畫一下就行 這有個例子,效果不一樣,你可以試著調一下里面的參數 drawable/ table_shape.xml <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android=" http://schemas.android.com/apk/res/android " > <solid android:color="#fff" /> //設置邊距 <padding android:bottom="10dp" android:left="10dp" android:right="10dp" android:top="10dp" /> //控制邊界線顏色和筆觸大小 <stroke android: width="1dp" android:color="#CdCdCd" /> //控制界面顏色漸變(你這個用不到) <gradient android:startColor="#E9E9E9" android:endColor="#FFFFFF" android:type= "linear" android:angle="90"/> //控制圓角大小 <corners android:radius="10dp" /> </shape> 然後在Linerlayout裡設置android:background="@drawable/table_shape" 就行啦!
可以調整想要圓角的網址
http://angrytools.com/android/button/
訂閱:
文章 (Atom)