你見過哪些令你瞠目結舌的 Android 代碼技巧?


大部分別人都提到了,簡單說點,其他想到再補充。。。

談不上多麼瞠目結舌,代碼很簡單,但是你不一定想得到。

1.判斷設備是否是 Tablet,適配Tablet設備的時候特別有用。

/**
* 判斷是否是 Tablet
*
* @param activity Activity
* @return true, if is tablet device
*/
public static boolean isTablet(Activity activity) {
DisplayMetrics dm = new DisplayMetrics();
activity.getWindowManager().getDefaultDisplay().getMetrics(dm);
double diagonalPixels = Math.sqrt(Math.pow(dm.widthPixels, 2) + Math.pow(dm.heightPixels, 2));
double screenSize = diagonalPixels / (160 * dm.density);
return screenSize &>= 6.0D;
}

2.添加一層自定義ViewGroup到DecorView下,並作為其唯一子節點。

寫庫的時候非常有用,例如左滑返回,例如小紅點全屏拖動

SlidingMenu就是這樣實現的。

/**
* 添加CustomLayout到DecorView下,作為其唯一子節點,CustomLayout層級會在Activity
* ContentView 之上。
* @param activity Activity
*/
public static void attachToActivity(Activity activity) {
ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView();

for (int i = 0; i &< decorView.getChildCount(); i++) { View view = decorView.getChildAt(i); if (view instanceof CustomLayout) { return; } } CustomLayout customLayout = new CustomLayout(activity); FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); customLayout.setLayoutParams(params); for (int i = 0; i &< decorView.getChildCount(); i++) { View v = decorView.getChildAt(i); decorView.removeView(v); customLayout.addView(v); } decorView.addView(customLayout, 0); }

3.用xml畫一個帶有漸變的loading圓環。

&
&
&
&
&


說一個自己看過的吧,大家知道 AlertDialog 的 context 通常需要是 Activity,所以想在 Service 或者 Receiver 里等無關 Activity 的場景彈對話框怎麼辦?

代碼如下:

public class DialogContainerActivity extends Activity {

private static DialogContextProvider mContextProvider;

public static void show(DialogContextProvider contextProvider) {
mContextProvider = contextProvider;
Intent intent = new Intent(App.getInstance() /*全局 Application 實例*/, DialogContainerActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
App.getApp().startActivity(intent);
}

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mContextProvider.getContext(this);
}

public interface DialogContextProvider {
void getContext(Activity activity);
}
}

然後給它設置個透明的主題,再加點陰影效果。。。全局 Dialog 需要的時候用它的靜態方法回調就可以在任意地方拿到 Activity 用來彈 Dialog 了。。。

// UPDATE: 2015-12-5 23:17

有幾位朋友對上面這段代碼有疑惑,確實上面的幾行代碼只是一個提供 Activity 的 Context 的工具 Activity,彈出 Dialog 的話可以這樣用:

DialogContainerActivity.show(activity -&> {
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setMessage(message);
builder.setPositiveButton(/*...*/);
builder.setNegativeButton(/*...*/);
// 監聽 setOnDismissListener 關閉 Container Activity
closeShadowContainer(builder, activity);
builder.show();
});

// 評論里有人指出,可以直接使用如下方法直接實現

在 show 之前可以給 dialog 設置屬性

dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);

然後添加許可權

&

不過這樣就不讓人「瞠目結舌」了,同時上面很多代碼也印證了這點——微觀上讓人瞠目結舌的代碼在項目中不一定是好代碼。

經測試 MIUI 下第二種方法是無效的(默認關閉了許可權,需要手動開啟),我還是用原來的方法吧,在流氓的環境下還是得用流氓的方法才有用。。。不瞎折騰了


1. XML布局的時候,為了預覽測試View布局的測試效果,你是不是經常寫一些測試的代碼,比如:

&

因為不想在簡歷上作假找了個工資低的工作,這樣值得么?
Android 4.4 還流行 tab bar 底部導航欄嗎?
谷歌有哪些著名的爛尾項目?
怎樣實現SwipeRefreshLayout的自動刷新?類似知乎安卓版一打開頁面就自動刷新載入的效果。
初使用 Android Studio ,體驗是不是很不好?

TAG:互聯網 | 程序員 | Android開發 | 代碼 | Java |