Android:为什么我的EditText会保留其价值,即使是方向更改?

时间:2011-12-02 19:25:43

标签: android orientation android-edittext

这是一个出于好奇的问题。

我最近刚刚了解到,我必须关心自己的活动状态。

但在我的一个Layouts中,Edittext只是保留了它的价值,我不知道为什么? 显然我想为其他EditTexts重现这种行为......

继承布局,编辑文本是android:id =“@ + id / createlistactivity_listname_edittext”

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >

<LinearLayout
    android:id="@+id/linearLayout2"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="@android:drawable/title_bar"
        android:gravity="center"
        android:text="Enter a Name"
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <EditText
        android:id="@+id/createlistactivity_listname_edittext"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="4dp"
        android:hint="Name..."
        android:singleLine="true" >

    </EditText>

</LinearLayout>


<LinearLayout
    android:id="@+id/linearLayout1"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/CreateListActivity_HeaderLabel"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="@android:drawable/title_bar"
        android:gravity="center"
        android:text="Add Products to your new List"
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <ListView
        android:id="@android:id/list"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:choiceMode="multipleChoice"
        android:footerDividersEnabled="true" >
    </ListView>

    <TextView
        android:id="@android:id/empty"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:paddingLeft="8dp"
        android:paddingRight="8dp"
        android:text="No Products available. Insert some Products in the Products menu  first" />

</LinearLayout>


<LinearLayout
    android:orientation="horizontal"
    android:id="@+id/CreateListActivity_BottomBar"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:weightSum="2"
    style="@android:style/ButtonBar" >


    <ImageButton
        android:id="@+id/CreateListActivity_SaveButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_weight="1"
        android:background="@android:color/transparent"
        android:onClick="saveButtonClicked"
        android:src="@drawable/tick_32" />


    <ImageButton
        android:id="@+id/CreateListActivity_CancelButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_weight="1"
        android:background="@android:color/transparent"
        android:onClick="cancelButtonClicked"
        android:src="@drawable/block_32_2" />

</LinearLayout>

</LinearLayout>

,这是活动的onCreate

    @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.createlistactivity_layout);

    _selectedItems = new HashMap<Integer, Integer>();
    _productDAO = new ProductDAO(getApplication());
    _listDAO = new ListDAO(getApplication());
    _productCursor = _productDAO.getAllProductsCursor();

    startManagingCursor(_productCursor);

    setUpListView();    

    final EditText listNameEditText = (EditText)this.findViewById(R.id.createlistactivity_listname_edittext);

    listNameEditText.setOnEditorActionListener(new OnEditorActionListener() {

        public boolean onEditorAction(TextView v, int actionId,
                KeyEvent event) {
            if (event != null&& (event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) {
                InputMethodManager in = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                in.hideSoftInputFromWindow(listNameEditText
                        .getApplicationWindowToken(),
                        InputMethodManager.HIDE_NOT_ALWAYS);
            }
            return false;
        }
    });     
}

这是另一个包含不保留其状态的edittexts的活动的代码

  <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/RelativeLayout1"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >


<TableLayout
    android:id="@+id/TableLayout1"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"
    android:layout_below="@id/productImage"
    android:background="@android:drawable/alert_light_frame" >

    <TableRow
        android:id="@+id/productview_toprow"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:gravity="top" >

        <EditText
            android:id="@+id/productview_productname"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="2"
            android:hint="Product Name"
            android:singleLine="true" >

            <requestFocus />
        </EditText>
    </TableRow>

    <TableRow
        android:id="@+id/tableRow2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >

        <TextView
            android:id="@+id/textView1"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_gravity="top"
            android:layout_weight="1"
            android:gravity="center_vertical|center_horizontal"
            android:text="@string/productview_pricelabel"
            android:textAppearance="?android:attr/textAppearanceLarge"
            android:textColor="@android:color/black" />

        <EditText
            android:id="@+id/productview_price_edittext"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:hint="0.0"
            android:singleLine="true"
            android:inputType="numberDecimal" />
    </TableRow>

    <TableRow
        android:id="@+id/tableRow3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >

        <TextView
            android:id="@+id/textView2"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:gravity="center_vertical|center_horizontal"
            android:text="@string/productview_unitlabel"
            android:textAppearance="?android:attr/textAppearanceLarge"
            android:textColor="@android:color/black" />

        <EditText
            android:id="@+id/productview_unit_edittext"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:hint="kg|ml|..." />
    </TableRow>
</TableLayout>

和onCreate ......

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.productview);

    _productName = (EditText)findViewById(R.id.productview_productname);
    _productPrice = (EditText)findViewById(R.id.productview_price_edittext);
    _productUnit = (EditText)findViewById(R.id.productview_unit_edittext);
    _productImage = (ImageButton)findViewById(R.id.productImage);

    _productDAO = new ProductDAO(getApplication()); 

    //set data from database
    _product = _productDAO.getProduct(getIntent().getExtras().getString(DataBaseKeys.PRODUCT_NAME));

    if(_product != null)
    {
        _productName.setText(_product.getName());
        _productImage.setImageBitmap(_product.getIcon());
        _productPrice.setText(""+_product.getPrice());
        _productUnit.setText(_product.getUnit());
        _productIcon = _product.getIcon();
    }           

}

2 个答案:

答案 0 :(得分:4)

android中的View确实保留了一些状态。与EditText一样保留其文字,因此您无需保存onSaveInstanceState。其他示例是ListView保持滚动位置。 EditText如果是多行文字,也会保持滚动位置。

但是,如果您正在使用Note App,用户必须采取一些措施,您必须存储正在编辑的Note ID,以便在更改方向时您知道自己在做什么。

这是Android的标准方式,这里没什么不寻常的。有关详细信息,请参阅。

Saving Activity State

关于您的某项活动不符合预期的原因是代码:

 _product = _productDAO.getProduct(getIntent().getExtras().getString(DataBaseKeys.PRODUCT_NAME));

if(_product != null)
{
    _productName.setText(_product.getName());
    _productImage.setImageBitmap(_product.getIcon());
    _productPrice.setText(""+_product.getPrice());
    _productUnit.setText(_product.getUnit());
    _productIcon = _product.getIcon();
}           

您正在覆盖编辑文本的值。在if语句之前尝试此日志语句。

Log.i("EDIT_NOT_WORKING", "VALUE OF EDIT: " + _productName.getText());

您应该看到它将打印输入的值。

答案 1 :(得分:0)

如果您没有为您的editText提供ID,则不会在屏幕更改中保存该值。您必须提供一个ID,以便保存该值,即使屏幕更改了方向。