使用Class.forName调用类

时间:2015-06-10 08:59:21

标签: java android class

我正在按照教程,我遇到了错误;根据教程,下面的代码必须工作并调用activity StartingPoint。但事实并非如此。 我简化了代码,只是调用activity无论如何,它都在工作,所以我只是复制这两个。你能检查一下吗?

不工作:

public class Menu extends ListActivity{

String classes[] = { "StartingPoint", "example1", "example2"
        , "example3", "example4", "example5", "example6"};  

@Override
public void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setListAdapter(new ArrayAdapter<String>(Menu.this, android.R.layout.simple_list_item_1, classes));
}

@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
    // TODO Auto-generated method stub
    super.onListItemClick(l, v, position, id);
    String cheese = classes[position];
    try{
    Class ourClass = Class.forName("com.thenewboston.travis." + cheese);        
    Intent ourIntent = new Intent(Menu.this,ourClass);
    startActivity(ourIntent);
    } catch (ClassNotFoundException e){
        e.printStackTrace();
    }
 }
}

这段代码工作正常,所以项目的其他部分就可以了:

public class Menu extends ListActivity{

String classes[] = { "StartingPoint", "example1", "example2"
        , "example3", "example4", "example5", "example6"};  

@Override
public void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setListAdapter(new ArrayAdapter<String>(Menu.this, android.R.layout.simple_list_item_1, classes));
}

@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
    // TODO Auto-generated method stub
    super.onListItemClick(l, v, position, id);
    Intent ourIntent = new Intent("com.thenewboston.travis.STARTINGPOINT");
    startActivity(ourIntent);
 }
}

我有一个P.S.这里也 :) 在第二个代码中,我使用大写'STARTINGPOINT'来调用activity,但是,在原始教程中他使用了'StartingPoint',并将其附加到类的名称,它是如何工作的?

的AndroidManifest.xml

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="8" />

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >

    <activity
        android:name=".Splash"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
          <activity
        android:name=".StartingPoint"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="com.thenewboston.travis.STARTINGPOINT" />

            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>

    <activity
        android:name=".Menu"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="com.thenewboston.travis.MENU" />

            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>
</application>

感谢。 :)

3 个答案:

答案 0 :(得分:1)

第一个示例使用反射来检索表示您要启动的Activity的类对象。在第二个中,您正在使用操作来启动下一个活动。打开AndroidManifest.xml并查找com.thenewboston.travis.STARTINGPOINT,您会发现与Activity相关联的操作

修改

"example1", "example2"
        , "example3", "example4", "example5", "example6"

必须是Activitiy子类,必须在AndroidManifest.xml文件中声明

答案 1 :(得分:0)

尝试使用Intent SetClass():

设置类名字符串
Intent intent = new Intent();
intent.setClassName(Menu.this, "com.thenewboston.travis." + cheese);
startActivity(intent);

答案 2 :(得分:0)

我发现了什么问题。我使用了不同的包名。 在项目开始时我选择<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.thenewboston" android:versionCode="1" android:versionName="1.0" > 直到这一点Intent没有引起任何错误,但我想当我使用Class ourClass = Class.forName("com.thenewboston.travis." + cheese);时 这将在包中搜索,但我的包名是com.example.thenewboston,所以我猜它是在包内搜索一个类。 无论如何,在更改所有内容并将文件移动到新包之后,一切正常! 但是,我仍然不知道为什么我不需要使用资本STARTINGPOINT并且StartingPoint仍在工作。我有一个猜测,我认为它不是在查看清单,而是查看java文件,文件的名称很重要。无论如何,我是一个新手,我只是在猜测。 :)