【问题标题】:New Activity nullpointerexception新活动空指针异常
【发布时间】:2011-04-07 20:47:27
【问题描述】:

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

我想从主要活动开始一个新活动。启动新活动的代码位于单独的类文件中。我似乎传递了错误的参数,并且在尝试启动新活动时遇到了空指针异常。当我将代码放在主活动类文件中时,新活动启动正常,因此第二个活动和清单很好。这是我的代码示例:

在我的主要活动课程中,我实例化了第二个课程(这是我的主要活动。我省略了其余部分,因为我认为这与问题无关):

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。任何人都可以启发我吗?我确定我错误地使用了上下文。

【问题讨论】:

    标签: android class android-activity nullpointerexception android-context


    【解决方案1】:

    活动以Intents 开始。请先阅读Android Application Fundamentals 并尝试使用 Hello World 应用程序 :)

    我知道您将不惜一切代价使用您单独的 Tester 类;)所以我正在努力适应并帮助您。

    首先,不要让你的类继承自 Activity。这对你没有帮助,因为这个调用可能没有任何有效的上下文。 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)。

    【讨论】:

    • onclick(view v) 在单独的类文件中找到。我必须将类扩展到活动才能使用 startactivity 还是其他方式?
    • 只是出于好奇:将 onClick 事件放在单独的类中的原因是什么?在上面的代码中:我不会从 Activity 扩展,而是如果需要,请在 Tester 类的构造函数中传递 Activity 的上下文,然后使用上下文调用诸如 startActivity(..) 等操作。
    • mytest.test(this); - 我在这里将主要活动的上下文传递给类并在我的意图中使用它,这部分是否正确?感谢您尝试帮助 Juri
    • 我在类中使用 onclick,因为加载时显示的内容取决于类中排序的条件。
    • 大量修改了我的帖子。看一下,它现在应该对你有用。您需要从有效的上下文中执行 startActivity。
    猜你喜欢
    • 1970-01-01
    • 2013-10-18
    • 1970-01-01
    • 1970-01-01
    • 2017-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-09
    相关资源
    最近更新 更多