2017-02-21 101 views
0

我嘗試在Android Studio中對自定義視圖進行編碼。到目前爲止這麼神。保存自定義視圖的實例

一切工作正常,除了保存視圖的實例。

視圖包含4個元素

  • Linear Layout(什麼包含2個TextViews
  • ImageView

旋轉屏幕或按返回並重新打開應用程序後,該ImageView不保存它是狀態/圖像。它恢復的是默認的圖像!

我嘗試過多種方式,但沒有什麼作用。

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); 
    } 
} 

編輯數字2:加入我的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> 
+0

我不不知道爲什麼要創建自定義視圖而不是使用RecyclerView或ListView。 – myatmins

+0

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

+0

我添加視圖不在設計器中。我添加他們,而我的應用程序是運行。所以控制這個原因更容易。 @AtefHares這不幫助我。因爲Funcions從未被調用過。 :( –

回答

0

您可以添加這可能代表你的「數」,然後在佈局構造得到了風格化,並增加一個風格化的屬性「計數」

+0

你有沒有一個你的意思的例子?不要讓你的意思是你的意思:/ –

+0

在attrs.xml中添加:'