2017-02-21 12 views
0

Я пытаюсь создать код пользовательского вида в Android Studio. Пока что бог.Сохранить экземпляр пользовательского вида

Все работает нормально, за исключением сохранения экземпляра вида.

The View Содержит 4 Elements

  • Linear Layout (то, что содержит 2 TextViews)
  • ImageView

после поворота экрана или нажмите Назад и снова открыть приложение, то ImageView не спасает это состояние/изображение. Он восстанавливает изображение по умолчанию!

Я пробовал несколько способов, но ничего не работает.

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: Добавьте XML моего CustomView

<?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> 
+0

Я не» t знать, почему вы создаете пользовательский вид вместо использования RecyclerView или ListView. – myatmins

+0

Check [this] (http://stackoverflow.com/a/3542895/5993410) –

+0

Я добавляю View не в конструктор. Я добавляю их, пока мое приложение Runing. Поэтому легче контролировать это. @AtefHares это не помогает мне. Потому что Funcions никогда не называются. :( –

ответ

0

Вы можете добавить допускающее применение стиля свойства, которое может представлять свой «счет», а затем в конструкторе макета получить допускающее применение стиля и приращение «считать»

+0

У вас есть пример того, что вы имеете в виду? Не упускайте того, что вы имеете в виду:/ –

+0

В attrs.xml add: ' 'Затем в вашем макете xml добавьте:' xmlns: custom = "http://schemas.android.com/apk/res-auto" '. Вы сделали бы это, если бы хотели, чтобы ваш xml получил доступ к пользовательскому счетчику. В противном случае в layoutfile.java, который расширяет ваш макет, есть 2 конструктора, которые принимают параметр AttributeSet. 'TypedArray a = context.obtainStyledAttributes (attrs, R.styleable.Identifier, 0, 0); Целочисленный счетчик = a.getInt (R.styleable.Identifier_counter); a.recycle(); ' –