0

为了在 Android 模拟器上显示已安装的应用程序,我尝试了此代码。它编译成功,但不起作用。怎么了?

package pack.GetAllInstalledApplications;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.content.pm.PackageInfo;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;

 public class GetAllInstalledApplicationsExample extends Activity {

 public  ArrayList <PackageInfoStruct> res = new ArrayList <PackageInfoStruct>();

 public ListView list;
 public String app_labels[];


 public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        getPackages();

        list = (ListView)findViewById(R.id.ListView01);
        try{
            list.setAdapter(new ArrayAdapter<String>         (this,android.R.layout.simple_dropdown_item_1line,app_labels));
        }catch(Exception e){
            System.out.println("Err ++> " + e.getMessage());
               Toast.makeText(getApplicationContext(),e.getMessage(),Toast.LENGTH_SHORT).show();
        }

 }
private ArrayList
 <PackageInfoStruct> getPackages() {
    ArrayList
 <PackageInfoStruct> apps = getInstalledApps(false);
    final int max = apps.size();
    for (int i=0; i < max; i++) {
        apps.get(i);
    }
    return apps;
}

private ArrayList
  <PackageInfoStruct> getInstalledApps(boolean getSysPackages) {

    List
  <PackageInfo> packs = getPackageManager().getInstalledPackages(0);
    try{
        app_labels = new String[packs.size()];
    }catch(Exception e){
                   Toast.makeText(getApplicationContext(),e.getMessage(),Toast.LENGTH_SHORT).show();
    }
    for(int i=0;i < packs.size();i++) {
        PackageInfo p = packs.get(i);
        if ((!getSysPackages) && (p.versionName == null)) {
            continue ;
        }
        PackageInfoStruct newInfo = new PackageInfoStruct();
        newInfo.appname = p.applicationInfo.loadLabel(getPackageManager()).toString();
        newInfo.pname = p.packageName;
        newInfo.versionName = p.versionName;
        newInfo.versionCode = p.versionCode;
        newInfo.icon = p.applicationInfo.loadIcon(getPackageManager());
        res.add(newInfo);

        app_labels[i] = newInfo.appname;
    }
    return res;
}
    }  
  class PackageInfoStruct {             
 String appname = "";           
 String pname = "";             
 String versionName = "";      
 int versionCode = 0;           
 Drawable icon;                 
  }
4

4 回答 4

0

我更改了适配器布局, 在您的代码上使用了android.R.layout.simple_list_item_1 ,它可以工作。

于 2012-05-10T21:43:58.637 回答
0

在您打电话给list.setAdapter您时,您可能应该使用不同的布局。我试过了simple_list_item_1

list.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, app_labels));

然后它似乎可以正确显示这些项目。

于 2011-11-23T02:44:45.363 回答
0

在呈现应用程序标签之前,您应该添加一些日志以了解您是否真的在检索应用程序。验证然后您可以处理适配器。

请记住,ArrayAdapter 的构造函数将文本视图的资源 id 作为第二个参数(否则它会崩溃),因此请确保这一点。

此外,为了丢弃系统包,我使用这行代码:

... if ((pi.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) 继续;...

其中 pi 是 PackageInfo。

让我知道它是否有效

于 2011-11-23T03:01:05.897 回答
-1

这可能是您的列表视图的问题。您可以创建一个自定义 ListView 项目,它同时具有 ImageView 和文本视图来显示您的包可绘制图像和包名称。

创建一个列表项 - list_single.xml

将此 xml 文件放在您的资源/布局中。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent"
 android:orientation="horizontal" >
 <ImageView
 android:id="@+id/icon"
 android:layout_width="50dp"
 android:layout_height="50dp"
 android:layout_marginBottom="5dp"
 android:layout_marginLeft="5dp"
 android:layout_marginRight="5dp"
 android:layout_marginTop="5dp"
 android:src="@drawable/ic_launcher" />
 <TextView
 android:id="@+id/Itemname"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:textSize="20sp" 
 android:paddingTop="5dp"/>
</LinearLayout>

main_activity.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="{relativePackage}.${activityClass}" >

 <ListView
 android:id="@+id/android:list"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent" />
</RelativeLayout>

最后,您的 MainActivity.java 文件

public class MainActivity extends ListActivity {

 String[] itemname ={
 "Safari",
 "Camera",
 "Global",
 "FireFox",
 "UC Browser",
 "Android Folder",
 "VLC Player",
 "Cold War"
 };

 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);

 this.setListAdapter(new ArrayAdapter<String>(
 this, R.layout.mylist,
 R.id.Itemname,itemname));
 }
}

注意:请注意,在此示例中,您使用的是自己的自定义布局,而不是使用默认布局类型之一:

this.setListAdapter(new ArrayAdapter<String>(
 this, R.layout.mylist,
 R.id.Itemname,itemname));
于 2014-10-15T05:26:59.530 回答