私はAndroidスタジオでカスタムビューをコーディングしようとしています。これまでのところ神様。カスタムビューのインスタンスを保存
ビューのインスタンスを保存する以外はすべて正常に動作します。
ビューは4要素のバックスクリーンやプレスを回転させた後
- (2
TextViews
が含まれているものを)Linear Layout
ImageView
が含まれており、ImageView
が保存されません、アプリケーションを再度開きますそれは状態/イメージです。元に戻すのはImage!
私は複数の方法を試みましたが、何も動作しません。
onSaveInstanceState()
とonRestoreInstanceState(Parcelable)
が呼び出されることはありませんし、:(
は、あなたが私を助けることを願って、なぜ私は知らない
#edit:は問題 GIF of Problem
のGIFを追加します。これまでのコードは
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のは:「
は<?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>
私はドン「カウント」私のCustomViewのXMLを追加します。 RecyclerViewまたはListViewを使用するのではなく、カスタム表示を作成する理由を理解しています。 – myatmins
[this](http://stackoverflow.com/a/3542895/5993410) –
デザイナーではないビューを追加します。私のアプリがランニング中にそれらを追加します。したがって、なぜこれを制御するのが簡単です。 @AtefHaresこれは私を助けない。 Funcionは決して呼び出されないからです。 : –