2015-07-20 48 views
1

我有延伸LinearLayout一个自定义视图:如何在Android的自定义视图中保存实例状态?

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

我要保存实例状态和恢复它,但它是从活动的实例状态不同。

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

回答

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

希望这有助于。

相关问题