保存自定义视图的实例

时间:2017-02-21 21:19:38

标签: java android android-custom-view savestate

我尝试在Android Studio中编写自定义视图。到目前为止,上帝。

除了保存视图的实例外,一切正常。

视图包含4个元素

  • Linear Layout(包含2 TextViews
  • ImageView

旋转屏幕或按Back并重新打开应用程序后,ImageView不会保存其状态/图像。它恢复是默认的Image!

我尝试了多种方法但没有任何作用。

onSaveInstanceState()onRestoreInstanceState(Parcelable)从未被调用过,我不知道原因:(

希望你能帮助我。

#edit:添加问题的GIF GIF of Problem

到目前为止,这是我的代码:

package de.codersgen.activitycontrol;
import android.content.Context;
import android.os.Bundle;
import android.os.Parcelable;
import android.util.AttributeSet;
import android.util.SparseArray;
import android.view.LayoutInflater;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

/**
 * Created by Ben Ny on 21.02.2017.
 */

public class ActivityView extends LinearLayout {

    private Context context;

    private static String STATE_SUPER_CLASS = "ActivitySuperClass";
    private static String STATE_HEADER_TEXT = "HeaderText";
    private static String STATE_INFO_TEXT = "InfoText";
    private static String STATE_STATUS_IMAGE = "StatusImage";

    private LinearLayout mTextContainer;
    private TextView mHeaderText;
    private TextView mInfoText;
    private ImageView mStatusImage;
    private int state = 0;
    private int[] stateImages = {
            R.drawable.infosign_black_24dp,
            R.drawable.check_black_24dp
    };

    public ActivityView(Context context) {
        super(context);
        this.context = context;
        initializeViews(context);
    }

    public ActivityView(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.context = context;
        initializeViews(context);
    }

    public ActivityView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        this.context = context;
        initializeViews(context);
    }

    private void initializeViews(Context context) {
        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        inflater.inflate(R.layout.container_view, this);
    }

    @Override
    protected void onFinishInflate() {
        super.onFinishInflate();
        mTextContainer = (LinearLayout) this
                .findViewById(R.id.textContainer);
        mHeaderText = (TextView) this
                .findViewById(R.id.headerText);
        mInfoText = (TextView) this
                .findViewById(R.id.infoText);
        mStatusImage = (ImageView) this
                .findViewById(R.id.statusImage);
        mStatusImage
                .setBackgroundResource(android.R.drawable.ic_media_next);
    }

    @Override
    protected Parcelable onSaveInstanceState() {
        super.onSaveInstanceState();
        Toast.makeText(context, "SAVE", Toast.LENGTH_SHORT).show();
        Bundle bundle = new Bundle();
        bundle.putParcelable(STATE_SUPER_CLASS,
                            super.onSaveInstanceState());
        bundle.putString(STATE_HEADER_TEXT, mHeaderText.getText().toString());
        bundle.putString(STATE_INFO_TEXT, mInfoText.getText().toString());
        bundle.putInt(STATE_STATUS_IMAGE, state);
        return bundle;
    }


    @Override
    protected void onRestoreInstanceState(Parcelable state) {
        if (state instanceof Bundle) {
            Bundle bundle = (Bundle) state;
            super.onRestoreInstanceState(bundle.getParcelable(STATE_SUPER_CLASS));
            setHeaderText("TEST");
            setInfotext(bundle.getString(STATE_INFO_TEXT));
            if (bundle.getInt(STATE_STATUS_IMAGE) == 1)
                setStatusFinish();
            else
                setStatusUnfinished();
        }
        else {
            super.onRestoreInstanceState(state);
        }
    }

    @Override
    protected void dispatchSaveInstanceState(SparseArray<Parcelable> container) {
        super.dispatchFreezeSelfOnly(container);
    }

    @Override
    protected void dispatchRestoreInstanceState(SparseArray<Parcelable> container) {
        super.dispatchThawSelfOnly(container);
    }

    public String getHeaderText() {
        mHeaderText = (TextView) this
                .findViewById(R.id.headerText);
        return mHeaderText.getText().toString();
    }

    public void setHeaderText(String text) {
        mHeaderText = (TextView) this
                .findViewById(R.id.headerText);
        mHeaderText.setText(text);
    }

    public String getInfoText() {
        mInfoText = (TextView) this
                .findViewById(R.id.infoText);
        return mInfoText.getText().toString();
    }

    public void setInfotext(String text) {
        mInfoText = (TextView) this
                .findViewById(R.id.infoText);
        mInfoText.setText(text);
    }

    public void setStatusUnfinished() {
        mStatusImage = (ImageView) this
                .findViewById(R.id.statusImage);
        state = 0;
        mStatusImage.setImageResource(R.drawable.infosign_black_24dp);
    }

    public void setStatusFinish() {
        mStatusImage = (ImageView) this
                .findViewById(R.id.statusImage);
        state = 1;
        mStatusImage.setImageResource(R.drawable.check_black_24dp);
    }

    public void setStatusOnClickListener(OnClickListener listener) {
        mStatusImage = (ImageView) this
                .findViewById(R.id.statusImage);
        mStatusImage.setOnClickListener(listener);
    }
}

编辑number2:添加我的CustomView的XML

    <?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <LinearLayout
        android:id="@+id/textContainer"
        android:orientation="vertical"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1">
        <TextView
            android:id="@+id/headerText"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:paddingLeft="10dp"
            android:textColor="@android:color/black"
            android:text="Example Header"
            android:textSize="19sp">
        </TextView>

        <TextView
            android:id="@+id/infoText"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="@android:color/holo_red_dark"
            android:paddingLeft="10dp"
            android:paddingBottom="3dp"
            android:text="Info Header"
            android:textSize="12sp">
        </TextView>
    </LinearLayout>
    <ImageView
        android:id="@+id/statusImage"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginRight="10dp"
        android:padding="5dp"
        android:src="@drawable/add_black_24dp"
        android:layout_weight="0.001">
    </ImageView>
</merge>

1 个答案:

答案 0 :(得分:0)

您可以添加一个可以代表您的&#34; count&#34;然后在布局构造函数中获取样式并增加&#34; count&#34;