3

我有一个初学者的问题。这是我的情况:新活动nullpointerexception

我想从主要活动开始一项新活动。启动新活动的代码位于单独的类文件中。我似乎传递了错误的观点,并且在尝试启动新的活动时,我以nullpointerexception结束。当我将代码放置在主活动类文件中时,新活动正常启动,因此第二个活动和清单都很好。这里是我的代码示例:

我主要的活动课,我实例化第二类(这是我的主要活动我省略了休息,因为我不认为这是有关的问题。):

Tester mytest = new Tester(); 
mytest.test(this); 

在我的第二类文件(这不是一项活动;它是被实例化活性的类):

public class Tester extends Activity { 
    Intent myIntent; 
    public void test (Context context) { 
       myIntent = new Intent (Intent.ACTION_VIEW); 
       myIntent.setClass(context, newActivity.class); 
       thebutton.setOnClickListener(
      new OnClickListener() { 
       public void onClick(View v) { 
        startActivity(myIntent); 
       } 
      }  
     ):} 

当我执行点击我收到的startactivity一个NullPointerException。任何人都可以启发我吗?我相信我错误地使用了上下文。

回答

4

活动开始于Intents。请先阅读Android Application Fundamentals,然后试用Hello World应用程序:)

我知道您将不惜一切代价使用您的单独Tester类;)所以我正在尝试适应并帮助您。首先,不要让你的类继承自Activity。这不会帮助你,因为这个调用可能没有任何有效的上下文。活动以某种方式实现模板模式,为您提供关键方法如onCreate(...),onPause(...)等,并由Android操作系统实例化。

如果您仍想使用该类,则必须传递上下文。无论如何,你可能正在瞄准一些MVC/MVP模式结构。

public class Tester { 
    private Context context; 
    public Tester(Context context){ 
     this.context = context; 
    } 

    public void test() { 
     final Intent myIntent = new Intent(context, NewActivity.class); 

     //guess this comes from somewhere, hope through a findViewById method 
     thebutton.setOnClickListener(
       new OnClickListener() { 
       public void onClick(View v) { 
        context.startActivity(myIntent); 
       } 
       }  
     )}; 
    } 
} 

这将是我提出的解决方案。我仍然在这里看到的问题是如何检索test()方法中的按钮。为了正确地工作,您必须从某个View类(view.findViewByid(R.id.myButton))检索它,或者在Activity的onCreate(...)期间动态创建它并将其与视图关联(可能使用Inflater)。

+0

onclick(view v)在单独的类文件中找到。我是否必须将课程扩展到活动才能使用startactivity或theres以另一种方式? – Yash 2010-09-03 14:08:11

+0

您需要使用startActivity的上下文:http://goo.gl/Wp60 – Juri 2010-09-03 14:25:58

+0

只是为了好奇:在单独的课程中使用onClick事件的原因是什么? 在上面的代码中:我不会从Activity扩展,但是如果需要,可以在Tester类的构造函数中传递活动的Context,然后使用上下文来调用startActivity(..)等操作。 – Juri 2010-09-03 14:30:06