Android输入组件返回空值

时间:2017-08-21 17:46:53

标签: java android xml android-fragments

我有一个小项目,其中包含一些输入组件,其中我试图获得某些按钮点击的值。 EditText值始终返回空和ToggleButton值 - 默认为false。我在这里错过了什么?为了简洁,我发出了大部分造型。

fragment_addnewitem.xml:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/addNewItemFragment"
tools:context=".controller.AddNewItemFragment"
tools:showIn="@layout/activity_addnewitem">

<EditText
    ...
    android:id="@+id/itemNameInput"
    android:inputType="text"
    .../>

 <Button
    ...
    android:id="@+id/saveButton"
    android:onClick="saveItem"
    android:text="SAVE"
    .../>

</android.support.constraint.ConstraintLayout>

activity_addnewitem.xml:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/addNewItem"
tools:context=".controller.AddNewItem">

<include layout="@layout/fragment_addnewitem" />

</FrameLayout>

AddNewItemFragment.java:

public class AddNewItemFragment extends Fragment {
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_addnewitem, container, false);
    return rootView;
}

AddNewItemActivity.java:

public class AddNewItem extends AppCompatActivity {

private Item item;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Item item = new Item();
    setContentView(R.layout.activity_addnewitem);
    if (savedInstanceState == null) {
        getSupportFragmentManager().beginTransaction().add(R.id.addNewItemFragment, new AddNewItemFragment()).commit();
    }

public void saveItem(View view) {
    //empty
    item.setName(((EditText)findViewById(R.id.itemNameInput)).getText().toString());
    }
}

当然我有更多的组件设置,但从代码角度看它们几乎相同。我还有一个带有OnDateSetListener的日期选择器设置,并且可以按预期工作。但EditText或ToggleButton都没有改变它们的值。

2 个答案:

答案 0 :(得分:0)

super()之后,在 onCreate()中,您创建了另一个Item对象,其名称与字段Item相同。这是影子。然后在 setContentView()之前创建Item对象。

我对你的课程进行了一些修改:

public class AddNewItem extends AppCompatActivity {
 private Item item; 
@Override
 protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_addnewitem); 
item = new Item();
if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction()
.add(R.id.addNewItemFragment, new AddNewItemFragment())
.commit();
}
}
public void saveItem(View view) {
//empty
item.setName(((EditText)findViewById(R.id.itemNameInput)).getText().toString());
}
}

答案 1 :(得分:0)

不知道为什么,但以下几行导致了EditTexts的问题:

if (savedInstanceState == null) {
    getSupportFragmentManager().beginTransaction().add(R.id.addNewItemFragment, new AddNewItemFragment()).commit();
}

删除它们并且EditTexts现在按预期工作,但我填充在Fragement上的Spinner不再填充,并且ToggleButtons总是返回false(isSelected())。