如何在Android中的自定义视图中保存实例状态?

时间:2015-07-20 07:12:07

标签: android instancestate

我有一个扩展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;
        }
    }

我想保存实例状态并将其恢复,但它与Activity的实例状态不同。

如何在Android中的自定义视图中保存实例状态?

1 个答案:

答案 0 :(得分:1)

不确定我是否理解正确。但看起来您希望独立于Activity实例保存View的状态并能够恢复它。 您可以使用保留的片段。

  • 扩展Fragment类并声明对有状态的引用 对象。
  • 创建片段时调用setRetainInstance(boolean)。
  • 将片段添加到您的活动中。
  • 使用FragmentManager在活动时检索片段 重新启动。

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

    }

要恢复已保存的对象,您可以使用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());
    }
}

您可以在此处找到有关该内容的更多信息:http://developer.android.com/guide/topics/resources/runtime-changes.html

希望这有帮助。