我在TabActivity that when clicked, opens an
AlertDialog with 2
EditText Views`中有一个名称和数字的按钮。
当我点击确定Button
关闭Dialog
时,我想将该名称重新传递回ListView
上的TabActivity
。我可以将名称传回EditText
上的mAlertDialog
框TabActivity
。但ListView
。
它看起来像对象“小部件”的引用(Widget
是类Device
的对象,具有getName
,setName
方法),com。 mypackage.Device@419226e0。
我会尝试在下面发布相关代码(是的,我知道我没有使用Fragments
。我发现很难用ListView
和{{1}实现水平滚动标签}):
Fragments
在调试时,logcat中没有错误。
但是,当我看到表达式@SuppressWarnings("deprecation")
public class MainActivity extends TabActivity implements OnClickListener {
public static ArrayList<Device> deviceList = new ArrayList<Device>();
public static ArrayAdapter<Device> deviceAdapter=null;
private static ListView deviceListView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTabHost= getTabHost();
TabHost.TabSpec spec;
Intent intent;
rButton = (Button)findViewById(R.id.button_register);
mAlertDialog = (EditText)findViewById(R.id.edittextresult_Name);
rButton.setOnClickListener(onRegister);
intent = new Intent (this, devices.class);
spec = mTabHost.newTabSpec("devices")
.setIndicator("Devices")
.setContent(R.id.devices);
mTabHost.addTab(spec);
deviceListView=(ListView)findViewById(R.id.rdevices);
//Attach array adapter to data array "deviceList"
deviceAdapter = new ArrayAdapter<Device>(this,android.R.layout.simple_list_item_1, deviceList);
//connect adapter "deviceAdapter" to listview widget so the activity listview is populated with data from the array
deviceListView.setAdapter(deviceAdapter);
}
private View.OnClickListener onRegister = new View.OnClickListener() {
public void onClick(View v) {
String title = "Register";
String buttonOk = "OK";
String buttonCancel = "Cancel";
String madd = "address";
String name = "widget name";
//get rdevice.xml view
LayoutInflater li = LayoutInflater.from(context);
View rView = li.inflate(R.layout.rdevice, null);
AlertDialog.Builder adRegister = new AlertDialog.Builder(context);
//set rdevice.xml to adRegister builder
adRegister.setView(rView);
//set title
adRegister.setTitle(title);
//Set EditText views to get user input
final EditText mField = (EditText)rView.findViewById(R.id.editText_Address);
final EditText nField = (EditText)rView.findViewById(R.id.editText_WidgetName);
//set dialog message
adRegister.setMessage("Message")
.setCancelable(false)
.setPositiveButton(buttonOk, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int BUTTON_POSITIVE) {
// TODO Auto-generated method stub
Device widget = new Device();
String madd = mField.getText().toString();
String name = nField.getText().toString();
widget.setName(name);
widget.setAddress(madd);
Log.d(TAG, "Address: " + madd);
Log.d(TAG, "Widget name: " + name);
//get user input and set it to result on main activity
mAlertDialog.setText(nField.getText());
deviceAdapter.add(widget);
deviceAdapter.notifyDataSetChanged();
}
})
.setNegativeButton(buttonCancel, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int BUTTON_NEGATIVE) {
}
});
//Create alert dialog
AlertDialog alertDialog = adRegister.create();
//show it
adRegister.show();
}
};
时,它会说
无法检索此
的正确封闭实例
即使应用程序中显示正确的名称。当我在调试后让程序完成时,此引用显示在mAlertDialog
“com.mypackage.Device@419226e0”中,而不是我在ListView
框中输入的名称。
这是否与范围或匿名内部类有关?请帮忙。我对Java并不熟悉,所以我迷失在这里的螺母和螺栓中。
答案 0 :(得分:0)
好的,我得到了它的工作。这非常有用:http://www.ezzylearning.com/tutorial.aspx?tid=6816874,特别是这句话
您可能想知道ListView将如何显示Product对象以及Product对象的哪个属性将被显示。答案很简单,默认情况下Android ListView控件在每个ListView项内部呈现一个简单的TextView,而TextView控件只能显示简单的文本。注意如何在我们上面定义的Product类中覆盖toString()函数。无论您将从对象toString()函数返回的String将显示在ListView项目中呈现的TextView中。
基本上,在我的Device.java类中,我不得不重写toString方法来指定要传递的对象成员,所以我包含了这段代码
@Override
public String toString(){
return this.name;
}