Android-ListActivity不';创建选项菜单时不显示项目
我有一个Android-ListActivity不';创建选项菜单时不显示项目,android,listview,listactivity,options-menu,Android,Listview,Listactivity,Options Menu,我有一个列表活动。每次启动时,都会运行一个AsyncTask来扫描我的IP地址,并在ListActivity中显示结果。一切正常。但是如果我创建了一个选项菜单(android 2.3),那么我的IP地址就不会显示在ListActivity中。当我单击菜单按钮时,AsyncTask仍正常工作,选项菜单显示正确。没有发生错误,ListActivity只是不显示IP。这是我的密码: public class MyIP extends ListActivity { ArrayList <D
列表活动
。每次启动时,都会运行一个AsyncTask
来扫描我的IP地址,并在ListActivity
中显示结果。一切正常。但是如果我创建了一个选项菜单(android 2.3),那么我的IP地址就不会显示在ListActivity
中。当我单击菜单按钮时,AsyncTask
仍正常工作,选项菜单显示正确。没有发生错误,ListActivity
只是不显示IP。这是我的密码:
public class MyIP extends ListActivity
{
ArrayList <Device> devicesList = new ArrayList<Device>();
AdapterListDevices adapter;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ListView listView = (ListView) findViewById(android.R.id.list);
registerForContextMenu(listView);
adapter = new AdapterListDevices(MyIP.this, R.layout.row_list_devices, devicesList);
setListAdapter(adapter);
scanMyDevice();
}
@Override
public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo menuInfo)
{
// Some code
}
@Override
public boolean onContextItemSelected(MenuItem item)
{
// Some code
}
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.myip_options_menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
// Some code
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
// Some code
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id)
{
// Some code
}
public void updateListAdapter(Device myDevice)
{
devicesList.add(myDevice);
adapter.notifyDataSetChanged();
}
public void scanMyDevice()
{
ScanMyDeviceTask smd = new ScanMyDeviceTask(MyIP.this);
smd.execute();
}
}
公共类MyIP扩展ListActivity
{
ArrayList DeviceList=新的ArrayList();
适配器列表设备适配器;
@凌驾
创建时的公共void(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ListView ListView=(ListView)findViewById(android.R.id.list);
registerForContextMenu(列表视图);
适配器=新适配器列表设备(MyIP.this、R.layout.row\u list\u设备、设备列表);
setListAdapter(适配器);
scanMyDevice();
}
@凌驾
public void onCreateContextMenu(ContextMenu菜单、View视图、ContextMenuInfo菜单信息)
{
//一些代码
}
@凌驾
公共布尔值onContextItemSelected(MenuItem项)
{
//一些代码
}
@凌驾
公共布尔onCreateOptions菜单(菜单)
{
MenuInflater充气机=getMenuInflater();
充气器。充气(R.menu.myip\u选项菜单,菜单);
返回true;
}
@凌驾
公共布尔值onOptionsItemSelected(菜单项项)
{
//一些代码
}
@凌驾
受保护的void onActivityResult(int请求代码、int结果代码、意图数据)
{
//一些代码
}
@凌驾
受保护的void onListItemClick(列表视图l、视图v、整数位置、长id)
{
//一些代码
}
public void updateListatAdapter(设备myDevice)
{
DeviceList.add(我的设备);
adapter.notifyDataSetChanged();
}
公共无效scanMyDevice()
{
ScanMyDeviceTask smd=新的ScanMyDeviceTask(MyIP.this);
execute();
}
}
这是我的ScanMyDeviceTask:
public class ScanMyDeviceTask extends AsyncTask <Void, Void, Void>
{
Context context;
ProgressDialog progDialog;
Device myDevice;
InetAddress myAddress;
public ScanMyDeviceTask(Context context)
{
this.context = context;
progDialog = new ProgressDialog(context);
}
@Override
protected void onPreExecute()
{
progDialog.setTitle("Searching...");
progDialog.setProgressStyle(progDialog.STYLE_SPINNER);
progDialog.show();
}
@Override
protected Void doInBackground(Void... params)
{
//Scan the ip address here
}
@Override
protected void onPostExecute(Void params)
{
MyIP act = (MyIP) context;
act.updateListAdapter(myDevice);
PublicData pd = (PublicData) act.getApplication();
pd.setMyIp(myAddress.getAddress());
progDialog.dismiss();
}
公共类ScanMyDeviceTask扩展异步任务
{
语境;
进展对话;
设备我的设备;
我的地址;
公共扫描MyDeviceTask(上下文)
{
this.context=上下文;
progDialog=新建ProgressDialog(上下文);
}
@凌驾
受保护的void onPreExecute()
{
progDialog.setTitle(“搜索…”);
progDialog.setProgressStyle(progDialog.STYLE_微调器);
progDialog.show();
}
@凌驾
受保护的Void doInBackground(Void…参数)
{
//在这里扫描ip地址
}
@凌驾
受保护的void onPostExecute(void参数)
{
MyIP法案=(MyIP)上下文;
act.updateListAdapter(我的设备);
PublicData pd=(PublicData)act.getApplication();
pd.setMyIp(myAddress.getAddress());
progDialog.discouse();
}
}在
scanMyDevice()
中的代码周围放置一个try catch
块,如下所示:
try {
ScanMyDeviceTask smd = new ScanMyDeviceTask(MyIP.this);
smd.execute();
}
catch(Throwable t) {
Log.e("scanMyDevice", e.toString());
}
如果在AsyncTask
中引发异常,则您的活动可能不会崩溃。然后你会看到你描述的行为-一切似乎都正常工作
因此,添加上面的代码将帮助您查看是否有异常发生。由于菜单资源是一个文件,我认为它需要使用所有小写字母作为文件名
inflater.inflate(R.menu.MyIP_options_menu, menu);
将文件名更改为使用所有小写字母(myip\u options\u menu.xml),然后在膨胀参数中使用R.menu.myip\u options\u菜单。经过几天的反复测试,我确信我的源代码是正确的。现在我发现了问题所在。要在ListActivity中显示项目,我使用一个名为AdapterListDevices的自定义ArrayAdapter(在单独的文件中)。你知道,当我在ListActivity中添加选项菜单代码时,它没有显示任何内容。然后我用了这个技巧:
- 对AdapterListDevices代码进行一些更改。(示例:在任意位置键入“blah”)
- 编译项目。(当然失败了,但并不重要)
- 更正适配器列表设备代码
- 编译项目
- 一切正常,ListActivity显示项目
所以,我的问题解决了。但我有一个愚蠢的问题:如果我更改一个文件中的源代码,为什么我的应用程序会出错?我不使用Eclipse,我使用记事本,并在命令promp中使用ant进行编译。我也不使用emulator,我在真实手机中安装了apk文件。新编译的应用程序安装在旧编译的应用程序之上。我按照你说的那样尝试了,没有错误。我确信AsyncTask工作正常,因为当AsyncTask启动时,将显示一个对话框。完成后,对话框将关闭。IP地址保存在应用程序类中。我可以检查所有这些。您的异步任务是否通知适配器数据已更改?当然可以。当我不创建选项菜单时,ListActivity会显示我的IP地址。这是我的ScanMyDeviceTask:请编辑您的问题并将代码张贴在那里。另外,您发布的内容只有
onPreExecute()
,我看不到您在哪里调用adapter.notifyDataSetChanged()
。哦,对不起。文件名实际上是小写的。我在这里上传源代码时更改了文件名,原因很多。