2014年8月12日火曜日

ウィジェットが置かれたのがロックスクリーンかホームスクリーンかを判断する

ウィジェットが置かれたのがロックスクリーンかホームスクリーンかを判断するには、以下を自前のAppWidgetProviderクラスのonUpdateから呼び出せばOK

 @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
 public boolean isPlacedOnLockscreen(Context context, int appWidgetId ){
  if( Build.VERSION.SDK_INT < 17 ){
   return false;
  }
  AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
  Bundle myOptions = appWidgetManager.getAppWidgetOptions(appWidgetId);
  int category = myOptions.getInt(
    AppWidgetManager.OPTION_APPWIDGET_HOST_CATEGORY, -1);
  return category == AppWidgetProviderInfo.WIDGET_CATEGORY_KEYGUARD; 
 }


ただしonDeletedからは読み出せないもよう。
回避策としては「データのクリア」を実行されないことを期待してPreferenceにappWidgetIdごとにどちらに置かれたら記憶させておくとかしますかね。

2014年8月5日火曜日

TextViewでgravity="center"にしても真ん中に寄らないで下にずれる

AndroidのTextViewで高さと文字サイズを指定したとき、TextViewに対して文字が大きすぎると、gravity="center"やpadding="0dp"を指定していても文字が下に寄る(つまり上部に余白ができる)ことがある。
例えば以下のようなレイアウトを表示させると
<FrameLayout 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" >

    <TextView
        android:layout_width="300dp"
        android:layout_height="40dp"
        android:layout_gravity="center"
        android:background="#dddddd"
        android:gravity="center"
        android:padding="0dp"
        android:text="あいうえおjkl"
        android:textAlignment="gravity"
        android:textSize="40dp" />
</FrameLayout>
こうなる↓

解決策はandroid:includeFontPadding="false"を追加すること。
追加すると、以下のように上部の余白がなくなる