2010年12月6日月曜日

Activityの状態を保存

主に、システムにActivityが強制終了させられる(システムにActivityが殺される)場合は、下記の3通りになります。

1.メモリ不足
2.長期間利用なし
3.画面の向き変更

この後、Activityは再起動される時があります(3番はすぐに再起動されます)。

通常は再開時にオブジェクトのフィールド値など、全てのデータは初期化されてしまいますが、何事もなかったかのようにActivityを再開する目的で一時的にデータを退避させておく仕組みがBundleです。

public class MainActivity extends Activity {

    int mInteger;
    ArrayList<Integer> mArray;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        ArrayList<Integer> mArray = (ArrayList<Integer>) getLastNonConfigurationInstance();
        if ( mArray == null ) {
            mArray = new ArrayList<Integer>();
            mArray.add(mInteger);
        }
    }

    // onCreateより後に呼ばれる。初期起動時は呼ばれない
    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {  
        super.onRestoreInstanceState(savedInstanceState);

        // Bundleよりデータを復元する
        // int getInt("キー名", 存在しない場合のデフォルト値);
        mInteger = saveInstanceState.getInt("integer", 0);
            mArray.add(mInteger);
    }

    // Activity終了時に呼ばれる
    @Override
    public Object onRetainNonConfigurationInstance() {
        // 保存オブジェクトを返す
        return mArray;
    }

    // Activity終了時に呼ばれる
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);

        // Activity再開時に渡すデータをBundle
        outState.putInt("integer", mInteger);
    }
}

2010年12月4日土曜日

Viewで文字列を描画

 // Viewを継承したクラスのメソッド
@Override
public void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    Paint rubyPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
    Paint textPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
    rubyPaint.setTextSize(12.0f);
    textPaint.setTextSize(24.0f);
    rubyPaint.setColor(Color.WHITE);
    textPaint.setColor(Color.WHITE);
    String ruby = "シリアライズ";
    String text = "serialize";
    float rubyX = (textPaint.measureText(text) - rubyPaint.measureText(ruby)) / 2;
    float textX = 0.0f;
    float rubyY = 32.0f;
    float textY = rubyY + textPaint.getTextSize();
    canvas.drawText(ruby, rubyX, rubyY, rubyPaint);
    canvas.drawText(text, textX, textY, textPaint);
    canvas.drawColor(Color.TRANSPARENT);
}

ScrollViewをヘッダとフッタではさむ

コンテンツはスクロールされ、ヘッダとフッタは固定されます。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <TextView
        android:id="@+id/header"
        android:layout_width="fill_parent"
        android:layout_height="32dip"
        android:layout_alignParentTop="true"
        android:background="#FFFF0000"
        android:text="header" />
    <TextView
        android:id="@+id/footer"
        android:layout_width="fill_parent"
        android:layout_height="32dip"
        android:layout_alignParentBottom="true"
        android:background="#FF0000FF"
        android:text="footer" />
    <ScrollView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/header"
        android:layout_above="@id/footer">
        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content">
            <EditText
                android:id="@+id/edit_text"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:inputType="text" />
            <TextView
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:background="#FF00FF00"
                android:text="@string/long_text" />
        </LinearLayout>
    </ScrollView>
</RelativeLayout>

Bitmapを水平に並べて描画

// Viewを継承した無名クラスの定義・生成 
View child = new View(this) { 
        @Override 
        public void onDraw(Canvas canvas) { 
                super.onDraw(canvas);
                Bitmap icon1 = BitmapFactory.decodeResource(getResources(), R.drawable.icon); 
                Bitmap icon2 = BitmapFactory.decodeResource(getResources(), R.drawable.icon); 
                Paint background = new Paint(); 
                background.setAlpha(255); 
                canvas.drawBitmap(icon1, 0, 0, background); 
                canvas.drawBitmap(icon2, icon1.getWidth(), 0, background); 
                canvas.drawColor(Color.TRANSPARENT); 
        }
}