顯示具有 android 標籤的文章。 顯示所有文章
顯示具有 android 標籤的文章。 顯示所有文章

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。

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

2015年1月14日 星期三

[Android] sp 跟 dp 的差別只有一句話

用 sp 為單位的東西會受到 顯示 -> 字型大小 的設定而改變
用 dp 為單位的東西則不會

所以 Android官方才會建議用 sp 做為字型大小的單位
目的就是讓使用者在更改字型大小的設定時,能控制到所有的字。

至於在不同大小螢幕部份,
用 sp 和用 dp 都可以使 layout 符合不同尺吋的螢幕,不必擔心。

2014年3月19日 星期三

Shell script Auto factory reset and adb logcat

這個Script 用來重覆紀錄 factory reset 的 log

Script 存成 .sh 檔 之後,記得 chmod +x 給予執行權限 
例如我把檔名叫做 factory_reset.sh 

$  chmod +x factory_reset.sh

要用的時候的也很簡單~

$  ./factory_reset.sh | tee log.txt

會把所有輸出在螢幕上的文字同時存成log.txt

#!/bin/bash

# for loop 1~10000, i++
for (( i=0; i<100000; i=i+1 ))
do
    echo "Run $i times"
    adb root
    # sleep 一下 (單位是秒)
    sleep 5

    # 清除 /data 下所有資料 
    adb shell wipe data

    # 沒有東西的話,清除時間不會太久,反正也是要睡一下
    sleep 10

    # 清完後reboot, 就是factory reset了
    adb reboot

    # sleep 一下隨意
    sleep 20
    
    adb wait-for-device 

    # 後面加個 & ,等等才可以中止adb logcat
    adb logcat &

    # 這邊sleep比較久是因為factory reset後的第一次開機時間都比較長
    # 當然也是每家手機時間長短不一,請自行調整
    sleep 300 
    
    # Kill 剛才的 adb logcat (就是模擬按 Ctrl+C )
    kill $!

done


--
P.S. 這個供開發使用,一般使用者手機若不能 adb root 不在此文解決範圍

2013年12月9日 星期一

ADB @ Win7 64bit 和 adb CreateProcess failure, error 2 的解決方式

今天遇到的是這個問題
* daemon not running. starting it now *
CreateProcess failure, error 2
* failed to start daemon *
error: cannot connect to daemon

原來是我借到了一台裝到 win7 64bit 的 NB

所以把 原來應該複製到 C:\Windows\System32\ 底下的
adb.exe、AdbWinApi.dll、AdbWinUsbApi.dll 放到
C:\Windows\SysWOW64 底下即可
(我現在是兩邊都有放的狀態,如果只放64底下不行的話,請兩邊都放)

再來就是確認windows有裝了你這隻手機的 USB driver
基本上先打開手機的USB debugging後,再接到windows7,電腦會自動安裝driver
有的手機也會提示你要不要裝driver

如果以上不能解決,那只好另請高明了……



2013年11月4日 星期一

解決CC File Fatal Error @ Android Build code [Ubuntu12.04~13.10 or Debian 7~8]

裝好套件是Build Android Codebase 的第一步
但xxx的就是冒出個我假冒android software engineer兩年來從沒遇過的build error

target arm C++: libwebrtc_system_wrappers <= external/webrtc/src/system_wrappers/source/map.cc
In file included from external/webrtc/src/system_wrappers/source/map.cc:11:0:external/webrtc/src/system_wrappers/source/../interface/map_wrapper.h:14:15: fatal error: map: No such file or directory compilation terminated.
make: *** [out/target/product/generic/obj/STATIC_LIBRARIES/libwebrtc_system_wrappers_intermediates/map.o] Error 1
make: *** Waiting for unfinished jobs....

原來是因為我設定了NDK_ROOT…
所以把原先定義在 ~/.profile 裡的NDK_ROOT幹掉就行了
(也有可能你是定義在 ~/.bashrc ?)

原先設定
#Android NDK
NDK_ROOT=~/android-ndk-r8
PATH=$NDK_ROOT:$PATH
NDK_Sample=$NDK_ROOT/samples
NDK_Workspace=~/workspace

export NDK_ROOT NDK_Sample NDK_Workspace PATH

改成這樣 (註解掉)
#Android NDK
#NDK_ROOT=~/android-ndk-r8
#PATH=$NDK_ROOT:$PATH
#NDK_Sample=$NDK_ROOT/samples
#NDK_Workspace=~/workspace
#export NDK_ROOT NDK_Sample NDK_Workspace PATH

記得要讓更改生效~(例如:登入登出)
為什麼這樣就可以了呢?
因為某個Bug…當NDK_ROOT被定義了之後,
webrtc makefiles 便不會去including STL ......Orz
記得Build完code要把NDK_ROOT定義回來哦~

2012年5月30日 星期三

Download Android repo file

2013/12/09 updated:
請參考我另一篇文章,內有目前最新的下載方式
http://francinelin.blogspot.tw/2013/12/aosp-repo-init-with-403-error-proxy.html


我發現要在網路上下載Android用的repo,沒有想像中簡單,
於是把手中公司用的repo file,改回Android 原先release的模樣
https://docs.google.com/open?id=0B88N-d-BuLbTVDZKRUdIeWQxSTA
(公開的google 文件,照google的說法是可被搜尋到)

下載後,可以複製到Linux檔案系統的 /bin 底下 (記得要有root權限)
例如,我原先放在我的家目錄底下 ( /home/francine )
那就可以在終端機裡,輸入以下指令

$ sudo cp /home/francine/repo /bin/repo

然後,移到 /bin 資料夾底下增加它的使用權限

$ cd /bin
$ sudo chmod +x repo

這樣你就可以在任何地方使用repo 指令,
不用每次都要複製到新的資料夾,還要下 ./repo 了~

如果跟我一樣,公司有公司用的repo,可以考慮把常用的放在/bin底下,
Android的則麻煩點,留著原始檔,
要用時再複製的你想要存放codebase的資料夾後,再增加使用權限
此舉是為了避免該資料夾上層也有可執行的repo檔,會發生不可執行的問題。
例如:我在 /home/francine 底下存了一個repo , 並chmod +x repo,
但 codebase 也放在 /home/francine 底下

此時,我把 repo 複製到 /home/francine/codebase 時,
等於他的上層資料夾(即 /home/francine)也有一個可執行的repo
terminal就會告訴你有此現象,導致無法正常的使用repo哦~