android 開發中遇到的問題彙總
Android:inputType="textPassword"
android:password="true"
2.Android中gravity與layout_gravity的區別
LinearLayout有兩個非常相似的屬性:android:gravity與android:layout_gravity。他們的區別在於:android:gravity用於設定View元件的對齊方式,而android:layout_gravity用於設定Container元件的對齊方式。
舉個例子,我們可以通過設定android:gravity="center"來讓EditText中的文字在EditText元件中居中顯示;同時我們設定EditText的android:layout_gravity="right"來讓EditText元件在LinearLayout中居中顯示
3. android 2.2版使用getFromLocation不能解析地址(錯誤:Service not Available);
4.部分真機getFromLocation()/getFromLocationName()返回0個解析值。
這是因為該真機版本不支援backend servic;下面是google原話
[xhtml] view plaincopyprint?
The Geocoder class requires a backend service that is not included in the core android framework. The Geocoder query methods will return an empty list if there no backend service in the platform. Use the isPresent() method to determine whether a Geocoder implementation exists.
5.旋轉動畫(旋轉後停在旋轉後的位置)
RotateAnimation rotateAnimation = new RotateAnimation(from, to,
Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
rotateAnimation.setInterpolator(new LinearInterpolator());
rotateAnimation.setDuration(ANIMATION_DURATION);
rotateAnimation.setFillAfter(true);
imageView.startAnimation(rotateAnimation);
1.android自定義日期時間對話方塊,在手工輸入日期數字後,點選儲存獲取日期對話方塊的值,發現所獲取的值是我們輸入前的那個值。
解決辦法:在獲取事件中,獲取日期之前,執行下日期對話方塊物件的clearFocus()即可。如:datePicker.clearFocus();
2.在HorizontalScrollView中,雖然我已經設了其子節點內容的寬度是fill_parent。但當內容較少時,其子節點還是根據內容自適應寬度,不能滿屏。出現右邊一塊空白。
解決辦法:設定HorizontalScrollView的android:fillViewport="true"。也就是設定是否將HorizontalScrollView的內容寬度拉伸以適應視口(viewport)
3.模擬器模擬sdcard插入或者拔出
先執行adb shell,進入模擬器的終端,然後輸入sdutil mount /sdcard 或者 sdutil unmount /sdcard
4.使用webview,在用JS調java方法時,2.3.3和2.2.2版會使應用程式直接崩潰,據網上說是android這兩個版本本省的bug,但是我發現一個解決方案:
在需要用js呼叫Java,我們可以通過console.log("你要傳的值");
在java端,先宣告一個WebChromeClient,複寫回撥函式onConsoleMessage(String message, int lineNumber, String sourceID),其中message就是你傳過來的值。這樣你就可以該幹嘛幹嘛,想幹嘛幹嘛。
測試2.1以上的版本都通過。
5.android xml 字串中的空格:  (代表空格)
6.點選LinearLayout使用selector改變TextView字型顏色
在父控制元件中新增android:clickable=“true” android:focusable=“true”,而在子控制元件中新增android:duplicateParentState=“true”子控制元件就能獲得父控制元件的點選事件
7.怎麼在release版下不輸出日誌?
方法一:如果有做程式碼混淆,在配置檔案中加入下面語句
-assumenosideeffects class android.util.Log {
public static *** d(...);
public static *** v(...);
public static *** i(...);
}
方法二:對於沒做程式碼混淆的,可以按照下面方法:
在manifest檔案中加入android:debuggable="@bool/build_log"
<application
android:name="MyApplication"
android:icon="@drawable/gift"
android:label="@string/app_name" android:debuggable="@bool/build_log">
定義一個日誌類
public class Lol {
public static final boolean ENABLE_LOG = true & MyApplication.sDebug;
private static final boolean DEBUG = true & ENABLE_LOG;
private static final boolean VERBOSE = true & ENABLE_LOG;
private static final boolean TEMP = true & ENABLE_LOG;
private static final boolean WARNING = true & ENABLE_LOG;
private static final boolean INFO = true & ENABLE_LOG;
private static final boolean ERROR = true & ENABLE_LOG;
public static void obvious(String tag, String msg) {
if (DEBUG) {
msg = "*********************************\n" + msg
+ "\n*********************************";
Log.d(tag, msg);
}
}
public static void d(String tag, String msg) {
if (DEBUG)
Log.d(tag, msg);
}
public static void d(boolean bool, String tag, String msg) {
if (TEMP&bool)
Log.d(tag, msg);
}
public static void i(String tag, String msg) {
if (INFO)
Log.i(tag, msg);
}
public static void e(String tag, String msg) {
if (ERROR)
Log.e(tag, msg);
}
public static void e(boolean bool, String tag, String msg) {
if (TEMP&bool)
Log.e(tag, msg);
}
public static void v(String tag, String msg) {
if (VERBOSE)
Log.v(tag, msg);
}
public static void w(String tag, String msg) {
if (WARNING)
Log.w(tag, msg);
}
public static String getStackTraceString(Exception e) {
return Log.getStackTraceString(e);
}
public static void w(String tag, String msg, Exception e) {
if (WARNING)
Log.w(tag, msg,e);
}
}
8.android使用include標籤出現nullpointer異常
在使用inlcude時,在inluce在include便籤中不能帶ID,如果帶了ID需要用inflate載入要被inlude的這個佈局檔案,然後再獲取這個佈局檔案上的物件。
我在使用的過程中發現,include標籤如果帶了ID,那麼他包含的佈局檔案的根節點就不要包含ID,否則出現nullpointer異常。
main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/parent"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="bottom"
android:orientation="vertical" >
<!-- 動態顯示介面 -->
<LinearLayout
android:id="@+id/body"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:background="@color/white"
android:orientation="vertical" >
</LinearLayout>
<!-- 底部功能選單欄 -->
<include
layout="@layout/tab_menu_view" />
</LinearLayout>
tab_menu_view.xml
<?xml version="1.0" encoding="UTF-8"?>
<RadioGroup xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/radiogroupMenu"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<RadioButton
android:id="@+id/radiobtnHome"
style="@style/main_tab_bottom"
android:checked="true"
android:drawableTop="@drawable/menu_home"
android:gravity="center"
android:text="定位" />
<RadioButton
android:id="@+id/radiobtnTrack"
style="@style/main_tab_bottom"
android:drawableTop="@drawable/menu_tracker"
android:gravity="center"
android:text="追蹤" />
<RadioButton
android:id="@+id/radiobtnHelp"
style="@style/main_tab_bottom"
android:drawableTop="@drawable/menu_help"
android:gravity="center"
android:text="求助" />
<RadioButton
android:id="@+id/radiobtnSecurity"
style="@style/main_tab_bottom"
android:drawableTop="@drawable/menu_mobilesafe"
android:gravity="center"
android:text="防盜" />
<RadioButton
android:id="@+id/radiobtnMore"
style="@style/main_tab_bottom"
android:drawableTop="@drawable/menu_more"
android:gravity="center"
android:text="更多" />
</RadioGroup>
8.ScrollView中的元件設定android:layout_height="fill_parent"不起作用的解決辦法
在ScrollView中新增一個android:fillViewport="true"屬性就可以了。顧名思義,這個屬性允許ScrollView中的元件去充滿它。
9.動態新增子view的時候,子view的設定了背景但是卻沒有填充整個子view.解決辦法:
在新增時候,設定新增的子view的填充方式
LinearLayout.LayoutParams params =new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT);
mBodyView.addView(getLocalActivityManager().startActivity(target, intent).getDecorView(),params);
10.自己寫的應用總是導致launcher重啟。原因是在設定全域性面板的時候加了<item name="android:windowIsTranslucent">true</item>。
然後再將對應的activity設定為橫屏或者豎屏,再加上android:configChanges="keyboardHidden|orientation",讓橫豎屏轉換時不執行oncreate即可。
11.獲取當前裝置的畫素,密度
DisplayMetrics metric = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metric);
int width = metric.widthPixels; // 螢幕寬度(畫素)
int height = metric.heightPixels; // 螢幕高度(畫素)
float density = metric.density; // 螢幕密度(0.75 / 1.0 / 1.5)
int densityDpi = metric.densityDpi; // 螢幕密度DPI(120 / 160 / 240)
Log.i(tag, width + "," + height + "," + density + "," + densityDpi);
12.當listview的item上面有checkbox控制元件時,你設定listview的item點選時更換背景不起作用。
解決辦法:設定checkbox的 android:clickable="false"
android:focusable="false"
13.android EditText設定輸入負小數:android:inputType="numberDecimal|numberSigned".