2016年11月7日 星期一

修改 searchView 中的 android:textColorHighlight及限定查詢字串長度

身為一個初接觸 android app 開發的菜鳥,很多簡單的事都要花時間去找方法

@怎麼增加一個searchView
1.  新增一個 .xml 在 res/menu下
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
    <item
        android:id="@+id/action_search"
        android:actionViewClass="android.widget.SearchView"
        android:icon="@drawable/search"
        android:showAsAction="always"
        android:title="@string/title_txt"/>
</menu>
2. java code裡怎麼用

getMenuInflater().inflate(R.menu.XXXX, menu);
MenuItem searchItem = menu.findItem(R.id.action_search);
searchView = (SearchView) searchItem.getActionView();
searchView.setQueryHint(getText(R.string.XXXXX));


3. 怎麼修改searchView中字反白的背景顏色(HighLight color)
    在java code中set textColorHighlight
    假設我要設定成 #0FC698 (雖然會超出版面,不過換行後也不好閱讀,就不換行了)

int searchPlateId = searchView.getContext().getResources().getIdentifier("android:id/search_plate", null, null);
View searchPlate = searchView.findViewById(searchPlateId);
if (searchPlate!=null) {
    int searchTextId = searchPlate.getContext().getResources().getIdentifier("android:id/search_src_text", null, null);
    TextView searchText = (TextView) searchPlate.findViewById(searchTextId);
    if (searchText!=null) {
 searchText.setHighlightColor(Color.parseColor("#00C698"));
    }
}

4. 查詢字數太長,會造成 JavaBinder: !!! FAILED BINDER TRANSACTION !!!
  所以需要限定查詢字數,這部份在onQueryTextChange處理

public boolean onQueryTextChange(String newText) {
    //Set Query text length limit - by Francine
    if(newText.length()>50){
 Log.i(TAG, "Text character is more than 50");
 searchView.setQuery(newText.substring(0,50), false);
    }
}


ref:
techrepublic- pro-tip-customize-the-android-search-view-widget
stackoverflow- android-actionbar-customize-search-view

2016年11月3日 星期四

Android 7.0 判斷是否在 multi-window 狀態

不曉得為什麼 Android Developer 裡提到的 Activity.inMultiWindow() 根本不能用
( https://developer.android.com/guide/topics/ui/multi-window.html )
下面提供真正可以用的方式

因為是 Android 7.0 才支援的功能,API/SDK 記得至少要 24

用 isInMultiWindowMode() 來得知是否處在多視窗狀態
由於 isInMultiWindowMode() 屬於 Activity.java,
所以如果是在 Activity 裡 可以用 this.isInMultiWindowMode()
如果是像我要使用在
public class OOXXFragment extends Fragment{}裡
那就用 getActivity().isInMultiWindowMode()

但Android studio會冒出warning,加上目前7.0以上的手機還不普及,
所以外圍加上判斷SDK的條件來解決此問題

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    if (getActivity().isInMultiWindowMode()){
        //做 multi-window要做的事
    }
}

如果是要做來吃不同layout,記得把判斷式放在 onCreate() 或 onCreateView()
至於強制portrait或landscape好像真的如官方所說不能用,即使是在java code裡使用
setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
一樣不行

但會偵測分割後的螢幕長寬來決定吃portrait或landscape的layout
(如果你兩個都有的話)
所以目前我只能很蠢的複製 portrait的layout,用另一個檔名命名,只要是 multi-window 就吃這個layout;
不過也有好處,微調一些參數也就不必怕影響原先正常的layout。

若有更好的方法,還請分享給我,謝謝。

adb remount fail 一直顯示 read-only file system

adb disable-verity 接著 adb reboot 使其生效

重開機完再重新 adb root  ->  adb remount 應該就可以成功