使用变量字符串定义下一个活动的意图

时间:2016-09-18 13:35:04

标签: android

我有一个ListView,可点击的组件包含超过25个项目。我想要实现的是当点击列表中的一个项目时,它会将您发送到与该项目相关的活动。

例如: 在列表中:狗种,猫种,鹿种

当" Cat Species"单击:打开有关不同种类猫的信息的活动。

既然我在列表中有很多项目,我不想创建几十个意图但是想要使用一个字符串(通过点击指定的项目收到的字符串)来创建一个意图并开始与该项目相关的活动。

所以我的问题是:如何将字符串转换为意图? 换句话说:我怎样才能获得字符串" Cat Species"进入课程项目" CatSpecies.class"?然后可以用来启动另一个活动的意图。

这里代码部分使用:

    @Override
        public void onItemClick(AdapterView<?> parent, View view,
                                int position, long id) {


            // ListView Clicked item value (including spaces): "Cat Species"
            String speciesValue = (String) listView.getItemAtPosition(position);

            // Name of the class, spaces removed: "CatSpecies"
            speciesValue = speciesValue.replace(" ", "");

            // Converts the speciesValue string into a .class: CatSpecies.class
            Class<?> speciesString = null;
            if (speciesValue != null) {
                try {
                    speciesString = Class.forName(speciesValue);
                } catch (ClassNotFoundException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }

            // Starts the intent to the provided String: CatSpecies.class
            Intent speciesActivity = new Intent(this, speciesString);
            startActivity(speciesActivity);
        }

    });

1 个答案:

答案 0 :(得分:0)

您可以初始化Map<String, Class>并使用它来获得您想要的内容,例如

 Map<String, Class> map;

 private void init() {

    map = new HashMap<String, Class>;
    map.put(ITEM_CAT, CatSpecies.class);
    ....
}

然后致电

@Override
public void onItemClick(AdapterView<?> parent, View view,
                        int position, long id) {


    // ListView Clicked item value (including spaces): "Cat Species"
    String speciesValue = (String) listView.getItemAtPosition(position);

    Class clazz = map.get(speciesValue);
    // Starts the intent to the provided String: CatSpecies.class
    Intent speciesActivity = new Intent(this, clazz);
    startActivity(speciesActivity);
    }

});

这是一个快速解决方案,但如果可扩展,则为idk。

无论如何,为了使您的代码有效,您还应该传递您正在处理的

因此,例如,如果CatSpecies与此类位于同一个包中,则应该具有类似

的内容
Class<?> speciesString = null;
            if (speciesValue != null) {
                try {
                    speciesString = Class.forName(this.getPackage() + speciesValue);
                } catch (ClassNotFoundException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }

然而,这也很容易出错。

在我看来,最好的解决方案是让你的适配器扩展BaseAdapter,并覆盖getItem。在适配器内部,您可以访问所有类,所以

Class[] classes = new Class[] { CatSpecies.class, DogSpecies.class}

public Object getItem(int arg0) {
// TODO Auto-generated method stub
    return classes[arg0];
}

那么,就这样,你可能会有像

这样的东西
@Override
public void onItemClick(AdapterView<?> parent, View view,
                        int position, long id) {

    String speciesValue = (String) listView.getItemAtPosition(position);
    Class speciesClass = listView.getAdapter().getItem(position);

    Intent speciesActivity = new Intent(this, speciesClass );
    startActivity(speciesActivity);
    }
});