Android 如何从GridView中的图标启动应用程序?

Android 如何从GridView中的图标启动应用程序?,android,Android,我正在尝试创建一个启动器,其中添加了一个GridView。这将获取所有已安装的应用程序,并将它们排列在网格中 问题是,当我点击这些网格项目时,什么都没有发生,我希望它打开应用程序 可能吗?这是我的密码: Apps.java: public class Apps extends Activity { SharedPreferences colors_app; GridView mGrid; @Override protected void onCreate(Bu

我正在尝试创建一个启动器,其中添加了一个
GridView
。这将获取所有已安装的应用程序,并将它们排列在网格中

问题是,当我点击这些网格项目时,什么都没有发生,我希望它打开应用程序

可能吗?这是我的密码:

Apps.java:

public class Apps extends Activity {

    SharedPreferences colors_app;
    GridView mGrid;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);

        loadApps();

        setContentView(R.layout.apps);

        mGrid = (GridView) findViewById(R.id.app_grid);
        mGrid.setAdapter(new AppsAdapter());

        colors_app = getSharedPreferences("MyColor", 1);

        int colorcode2 = colors_app.getInt("color_code", 0);
        if (colorcode2 != 0) {

            Apps.this.findViewById(R.id.apps_back).setBackgroundColor(
                    colorcode2);

        }
    }

    private List<ResolveInfo> mApps;

    private void loadApps() {
        Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
        mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);

        mApps = getPackageManager().queryIntentActivities(mainIntent, 0);
    }

    public class AppsAdapter extends BaseAdapter {
        public AppsAdapter() {
        }

        public View getView(int position, View convertView, ViewGroup parent) {
            ImageView i;

            if (convertView == null) {
                i = new ImageView(Apps.this);
                i.setScaleType(ImageView.ScaleType.FIT_CENTER);
                i.setLayoutParams(new GridView.LayoutParams(90, 90));
                i.setPadding(10, 10, 10, 10);
            } else {
                i = (ImageView) convertView;
            }

            ResolveInfo info = mApps.get(position);
            i.setImageDrawable(info.activityInfo.loadIcon(getPackageManager()));

            return i;
        }

        public final int getCount() {
            return mApps.size();
        }

        public final Object getItem(int position) {
            return mApps.get(position);
        }

        public final long getItemId(int position) {
            return position;
        }
    }
}
公共类应用扩展活动{
共享参考颜色\u应用程序;
GridView-mGrid;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
//TODO自动生成的方法存根
super.onCreate(savedInstanceState);
loadApps();
setContentView(R.layout.apps);
mGrid=(GridView)findviewbyd(R.id.app\u grid);
mGrid.setAdapter(新的AppsAdapter());
颜色应用程序=GetSharedReferences(“MyColor”,1);
int colorcode2=colors\u app.getInt(“color\u code”,0);
如果(颜色代码2!=0){
Apps.this.findViewById(R.id.Apps\u back).setBackgroundColor(
色码2);
}
}
私人名单地图;
私有void loadApps(){
意图maintent=新意图(Intent.ACTION\u MAIN,空);
mainIntent.addCategory(Intent.CATEGORY_启动器);
mApps=getPackageManager().QueryInputActivities(mainIntent,0);
}
公共类AppsAdapter扩展BaseAdapter{
公共AppsAdapter(){
}
公共视图getView(int位置、视图转换视图、视图组父视图){
图像视图i;
if(convertView==null){
i=新图像视图(Apps.this);
i、 setScaleType(ImageView.ScaleType.FIT_CENTER);
i、 setLayoutParams(新的GridView.LayoutParams(90,90));
i、 设置填充(10,10,10,10);
}否则{
i=(图像视图)转换视图;
}
ResolveInfo=mApps.get(位置);
i、 setImageDrawable(info.activityInfo.loadIcon(getPackageManager());
返回i;
}
公共最终整数getCount(){
返回mApps.size();
}
公共最终对象getItem(int位置){
返回mApps.get(位置);
}
公共最终长getItemId(int位置){
返回位置;
}
}
}

您的代码中没有任何应该启动另一个应用程序的内容。您需要添加一些代码来运行网格中显示的应用程序。您可以为
mGrid
实现一个
OnItemClickListener
,或者为适配器内的每个
ImageView
添加一个
OnClickListener

请从以下位置查看此示例:


请记住,此代码应该与
列表视图
一起使用,而不是与
网格视图
一起使用,因此请确保为您的案例实现类似的功能。您已经有了一个
ResolveInfo
对象列表,因此您可以使用它通过每个项目的位置访问每个应用程序的
ActivityInfo

我自己找到了答案:-)只需将此代码放到
onCreate
下面的
setContentView
中,就完成了!代码工作起来很有魅力

mGrid.setOnItemClickListener(new OnItemClickListener() {

            public void onItemClick(AdapterView<?> parent, View convertView,
                    int position, long id) {
                ResolveInfo cleckedResolveInfo = (ResolveInfo) parent
                        .getItemAtPosition(position);
                ActivityInfo clickedActivityInfo = cleckedResolveInfo.activityInfo;

                Intent intent = new Intent(Intent.ACTION_MAIN);
                intent.addCategory(Intent.CATEGORY_LAUNCHER);
                intent.setClassName(
                        clickedActivityInfo.applicationInfo.packageName,
                        clickedActivityInfo.name);
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
                        | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
                startActivity(intent);
            }

        });
mGrid.setOnItemClickListener(新的OnItemClickListener(){
public void onItemClick(AdapterView父级、View convertView、,
内部位置,长id){
ResolveInfo clecedResolveInfo=(ResolveInfo)父级
.getItemAtPosition(位置);
ActivityInfo点击ActivityInfo=clecedResolveInfo.ActivityInfo;
意向意向=新意向(意向.行动\主要);
intent.addCategory(intent.CATEGORY_启动器);
intent.setClassName(
单击ActivityInfo.applicationInfo.packageName,
单击ActivityInfo.name);
intent.setFlags(intent.FLAG\u活动\u新任务
|意图。标记活动重置任务(如果需要);
星触觉(意向);
}
});

我为GridView添加了一个监听器,现在它工作起来很有魅力!
mGrid.setOnItemClickListener(new OnItemClickListener() {

            public void onItemClick(AdapterView<?> parent, View convertView,
                    int position, long id) {
                ResolveInfo cleckedResolveInfo = (ResolveInfo) parent
                        .getItemAtPosition(position);
                ActivityInfo clickedActivityInfo = cleckedResolveInfo.activityInfo;

                Intent intent = new Intent(Intent.ACTION_MAIN);
                intent.addCategory(Intent.CATEGORY_LAUNCHER);
                intent.setClassName(
                        clickedActivityInfo.applicationInfo.packageName,
                        clickedActivityInfo.name);
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
                        | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
                startActivity(intent);
            }

        });