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()
。哦,对不起。文件名实际上是小写的。我在这里上传源代码时更改了文件名,原因很多。