Android - 创建选项菜单时,ListActivity不显示项目

时间:2013-12-09 20:45:45

标签: android listview listactivity options-menu

我有ListActivity。每次启动时,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();
    }
}

这是我的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();

}

}

3 个答案:

答案 0 :(得分:0)

try-catch中围绕代码放置一个scanMyDevice()块,如下所示:

try {
    ScanMyDeviceTask smd = new ScanMyDeviceTask(MyIP.this);
    smd.execute();
}
catch(Throwable t) {
    Log.e("scanMyDevice", e.toString());
}

如果AsyncTask中出现异常,您的活动可能不会崩溃。然后你会看到你描述的行为 - 一切似乎都正常工作。

因此,添加上述代码可以帮助您查看是否存在异常。

答案 1 :(得分:0)

由于菜单资源是一个文件,我认为它需要使用全部小写的文件名。

    inflater.inflate(R.menu.MyIP_options_menu, menu);

更改文件名以使用全部小写(myip_options_menu.xml),然后在通货膨胀arg中使用R.menu.myip_options_menu。

答案 2 :(得分:0)

经过几天一次又一次地测试我的源代码,我确信我的源代码是正确的。现在我发现了问题。要在ListActivity中显示项目,我使用名为AdapterListDevices的自定义ArrayAdapter(在单独的文件中)。你知道,当我在ListActivity中添加选项菜单代码时,它没有显示任何内容。然后我用了这个技巧:

  • 在AdapterListDevices代码中进行一些更改。 (例如:在任何地方输入“blah”)
  • 编译项​​目。 (当然它失败了,但并不重要)
  • 更正AdapterListDevices代码。
  • 编译项​​目。
  • 一切正常,ListActivity显示项目。

所以,我的问题解决了。但我有一个愚蠢的问题:如果我在一个文件中更改源代码,为什么我的应用程序出错?我不使用Eclipse,我使用记事本并在命令提示符下使用ant编译。我也不使用模拟器,我在真正的手机中安装apk文件。新编译的应用程序安装在旧的已编译应用程序上。