1

I have a a custom View that extends LinearLayout :

public class CustomEditTextLogin extends LinearLayout {
    public CustomEditTextLogin(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
        initialize(context);
    }
    public CustomEditTextLogin(Context context, AttributeSet attrs) {
        super(context, attrs);
        // TODO Auto-generated constructor stub
        initialize(context);
    }
    private LinearLayout llParentCetL;
    private TextView txtAlertCs;
    private EditText edt;
    private ImageView img;
    public static final int TEXT = 0;
    public static final int EMAIL = 1;
    public static final int PASSWORD = 2;
    public static final int USERNAME = 3;
    private void initialize(Context context) {
        LayoutInflater mLayoutInflater = (LayoutInflater)
        context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View view = mLayoutInflater.inflate(R.layout.custom_edit_text_login, this, true);
        llParentCetL = (LinearLayout) view.findViewById(R.id.llParentCetL);
        txtAlertCs = (TextView) view.findViewById(R.id.txtAlertCetL);
        edt = (EditText) view.findViewById(R.id.edtCetL);
        img = (ImageView) view.findViewById(R.id.imgCetL);

        txtAlertCs.setVisibility(View.GONE);
        int imgMargin = (int) (UIHelpers.width *0.025);
        UIHelpers.setMargin(img, imgMargin, imgMargin, imgMargin, imgMargin);
        img.setOnClickListener(new OnClickListener() {   
            @Override
            public void onClick(View view) {
                setFocus();
            }
        });
        public CustomEditTextLogin setFocus(){
            if(edt != null){
                edt.setFocusableInTouchMode(true);
                edt.requestFocus();

                InputMethodManager imm = (InputMethodManager) App.context.getSystemService(Context.INPUT_METHOD_SERVICE);
                imm.showSoftInput(edt, InputMethodManager.SHOW_IMPLICIT);
            }
            return this;
        }
    }

I want to save instance state and restore it, but it is different from Activity's instance state.

How to save instance state on custom view in Android?

galath
  • 5,717
  • 10
  • 29
  • 41
Hossein Kurd
  • 3,184
  • 3
  • 41
  • 71

1 Answers1

1

Not sure that I understood you correctly. But looks like you want to save the state your View independently from Activity instance and be able to restore it. You can use retained fragments for this.

  • Extend the Fragment class and declare references to your stateful objects.
  • Call setRetainInstance(boolean) when the fragment is created.
  • Add the fragment to your activity.
  • Use FragmentManager to retrieve the fragment when the activity is restarted.

    public class RetainedFragment extends Fragment {
    
    // data object we want to retain
    private MyDataObject data;
    
    // this method is only called once for this fragment
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // retain this fragment
        setRetainInstance(true);
    }
    
    public void setData(MyDataObject data) {
        this.data = data;
    }
    
    public MyDataObject getData() {
        return data;
    }
    

    }

To restore saved object you can use FragmentManager.

    public class MyActivity extends Activity {

    private RetainedFragment dataFragment;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // find the retained fragment on activity restarts
        FragmentManager fm = getFragmentManager();
        dataFragment = (DataFragment) fm.findFragmentByTag(“data”);

        // create the fragment and data the first time
        if (dataFragment == null) {
            // add the fragment
            dataFragment = new DataFragment();
            fm.beginTransaction().add(dataFragment, “data”).commit();
            // load the data from the web
            dataFragment.setData(loadMyData());
        }

        // the data is available in dataFragment.getData()
        ...
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        // store the data in the fragment
        dataFragment.setData(collectMyLoadedData());
    }
}

Here you can find more information about that: http://developer.android.com/guide/topics/resources/runtime-changes.html

Hope this helps.

Andrey E
  • 856
  • 8
  • 18