2012-08-17 56 views
2

我在TabActivity中有一个按钮that when clicked, opens an AlertDialog with 2 EditText Views`为一个名字和数字。android从alertdialog传递对象成员回到列表视图

当我点击Ok Button关闭Dialog时,我想将名称传回上的ListView。我可以通过TabActivity得到名称回EditTextmAlertDialog。但名称以外的内容正在ListView中显示。

它看起来像到对象“窗口小部件”的引用(Widget是类Device,其具有getNamesetName方法的目的),[email protected]

我会尝试后下相关的代码(是的,我知道我没有使用Fragments我发现很难实现水平滚动的标签与Fragments一个ListView):

@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(); 

     } 

    }; 

在调试时,logcat中没有错误。

然而,当我看的表达mAlertDialog它说

无法检索即使正确的名称将显示在应用程序的该

正确的外围实例。当我在调试后让程序结束时,此参考将显示在ListView[email protected]”中,而不是在AlertDialog框中键入的名称。

这是否与范围或匿名内部类有关?请帮忙。我对Java并不熟悉,因此我迷失在这里的细枝末节。

+0

'mAlertDialog.setText(nField.getText( ));' - 由于'nField'是一个'EditText',所以你需要使用'nField.getText()。toString()'。 – Squonk 2012-08-17 16:26:54

+0

mAlertDialog已经正确显示我输入nField的名称。问题在于deviceListView中显示的内容。 – jawin 2012-08-17 17:22:26

回答

0

好吧我得到它的工作。这是非常有益的:http://www.ezzylearning.com/tutorial.aspx?tid=6816874,特别是这句话

你可能想知道ListView控件将如何展示产品对象和产品对象的属性将被显示出来。答案很简单,默认情况下,Android ListView控件在每个ListView项目内呈现一个简单的TextView,而TextView控件只能显示简单的文本。注意toString()函数在我们上面定义的Product类中是如何被覆盖的。无论将从对象返回的字符串toString()函数都将显示在ListView项目中呈现的TextView中。

基本上,在我的Device.java类,我不得不重写toString方法来指定哪个对象构件穿过,所以包括在此代码

@Override 
public String toString(){ 
    return this.name; 
} 
相关问题