0

アプリは、向きの変更時に描画するビューを保存することになっていますが、そうではありません。誰が問題がどこにあるかを言うことができますか?

エラーは発生しませんが、デバイスの向きを変更すると、描画したものを保存せずにビューが再起動します。

public DrawingView(Context context, AttributeSet attrs) {
    super(context, attrs);
    conAdd();
}

public DrawingView(Context context) {
    super(context);
    conAdd();

}

private void conAdd() {
    paint = new Paint(Paint.ANTI_ALIAS_FLAG);
    paint.setColor(Color.GREEN);
    paint.setStyle(Style.STROKE);
    paint.setStrokeCap(Paint.Cap.ROUND);
    paint.setStrokeJoin(Paint.Join.ROUND);
    paint.setStrokeWidth(width);
    path = new Path();
    setOnTouchListener(this);
    setBackgroundColor(Color.BLACK);

}

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_4444);
    Canvas canvasNew = new Canvas();
    canvasNew.setBitmap(bitmap);
    canvas = canvasNew;
    super.onSizeChanged(w, h, oldw, oldh);
}

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    canvas.drawPath(path, paint);
    canvas.drawBitmap(bitmap, 0, 0, paint);
}

public boolean onTouch(View v, MotionEvent event) {
    float x = event.getX();
    float y = event.getY();
    if (event.getAction() == MotionEvent.ACTION_DOWN) {
        path.reset();
        path.moveTo(x, y);
        invalidate();
    }
    if (event.getAction() == MotionEvent.ACTION_MOVE) {
        if (Math.abs(x - lastX) > 4 || Math.abs(y - lastY) > 4) {
            path.quadTo(lastX, lastY, (lastX + x) / 2, (lastY + y) / 2);
            invalidate();

        }

    }

    if (event.getAction() == MotionEvent.ACTION_UP) {
        path.lineTo(x, y);

        canvas.drawPath(path, paint);
    }

    lastX = x;
    lastY = y;
    return true;

}


 @Override
    protected Parcelable onSaveInstanceState() {
        Bundle inBox = new Bundle();
        inBox.putParcelable("draw", super.onSaveInstanceState());
        inBox.putParcelable("bitmap", bitmap);
        return super.onSaveInstanceState();

    }



 @Override
    protected void onRestoreInstanceState(Parcelable state) 
    {
         if (state instanceof Bundle) {
              Bundle outBox = (Bundle) state;
              this.bitmap = outBox.getParcelable("bitmap");
              super.onRestoreInstanceState(outBox.getParcelable("draw"));
              return;
         }
         super.onRestoreInstanceState(state);
    }

}

4

4 に答える 4

0

実行時に構成の変更を管理する必要があります-これがどこにあるのかを見つけるのにも長い時間がかかりました:

http://developer.android.com/guide/topics/resources/runtime-changes.html

引用:
次のマニフェスト コードは、画面の向きの変更とキーボードの可用性の変更の両方を処理するアクティビティを宣言します。

<activity android:name=".MyActivity"
    android:configChanges="orientation|keyboardHidden"
    android:label="@string/app_name">
于 2012-08-15T08:39:54.010 に答える
0

使ってみましたか

<activity android:name=".YourActivity" android:configChanges="orientation|screenSize">

?

「方向」だけでは配信に失敗する可能性がありますが、「screenSize」オプションを追加するとうまくいくことに注意してください。

于 2013-07-14T21:50:09.523 に答える
0

super.onSaveInstanceState();独自のバンドル ( ) を返却するのではなく、返却していますinBox。したがって、保存されたデータには何も行われません。

于 2015-01-28T10:31:48.353 に答える