gpt4 book ai didi

android - 如何在 Android 的自定义 View 上保存实例状态?

转载 作者:行者123 更新时间:2023-11-30 02:00:49 26 4
gpt4 key购买 nike

我有一个扩展 LinearLayout 的自定义 View :

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 中的自定义 View 上保存实例状态?

最佳答案

不确定我是否正确理解了您的意思。但是看起来您想独立于 Activity 实例保存 View 的状态并能够恢复它。您可以为此使用保留的 fragment 。

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

    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

希望这对您有所帮助。

关于android - 如何在 Android 的自定义 View 上保存实例状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31510630/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com