【问题标题】:Moving code to another class leads to app crash将代码移动到另一个类会导致应用程序崩溃
【发布时间】:2016-06-15 11:22:13
【问题描述】:

我正在创建一个 Android 应用,一切似乎都运行良好。当我尝试将一些代码移动到另一个文件以解决问题时,问题就开始了。

假设应用有一个微调器和一个按钮。按下按钮会读取 Spinner 当前选定的字符串,并显示一个 Toast。所以代码是:

Spinner spinnerOmadas=(Spinner) findViewById(R.id.spinnerOmadas);
String omada = spinnerOmadas.getSelectedItem().toString();

Toast.makeText(getApplicationContext(), omada,Toast.LENGTH_SHORT).show();

如果我将此代码保留在主活动中按钮的 onClick 函数中,则一切正常。我想将它移动到另一个文件,因为我将向它添加更多代码。

所以我创建了一个文件buttonCalculation.java,代码如下:

package com.test.example;

import android.widget.EditText;
import android.widget.Spinner;
import android.widget.Toast;

public class buttonCalculation extends MainActivity {

    public void calculate(){

        Spinner spinnerOmadas=(Spinner) findViewById(R.id.spinnerOmadas);
        String t1= spinnerOmadas.getSelectedItem().toString();

        Toast.makeText(getApplicationContext(), t1, Toast.LENGTH_SHORT).show();

    }

}

在主要活动的 onClick 方法中,我这样做:

buttonCalculation b1 = new buttonCalculation();
b1.calculate();

根据我的方法,Android Studio 没有错误,但是当我运行应用程序并按下按钮时,它崩溃了。

有什么我必须声明才能找到主 Activity 的对象吗?

【问题讨论】:

  • 使用实例。
  • 这不应该是你收拾东西的方式。如果有的话,你会让它变得更加复杂和难以维护。
  • 嘿伙计。我努力阅读您的日志并将错误粘贴到您的问题中。你回复了那个?您拒绝向我们展示您的错误是怎么回事?
  • 什么意思?什么拒绝?你要了我的 logcat,我把它贴出来了。 @shantanu 的回答有效。问题是布局没有在任何地方定义,如果不传递给新的类/方法就无法访问。
  • 您的日志包含:java.lang.NullPointerException at android.app.Activity.findViewById(Activity.java:1825) at com.duk3r.prisma.buttonCalculation.calculate(buttonCalculation.java:14) at com.duk3r.prisma.MainActivity$1.onClick(MainActivity.java:53) 等等...如果您将其留在问题中(就像我为您添加的那样)而不是 6000 行 logcat,那将这是一个完美的问题。

标签: java android function class


【解决方案1】:

我认为问题在于函数findViewById(),因为您没有在buttonCalculation 类中定义任何布局。因此,您必须将其作为参数传递。

public class ButtonCalculation { //I don't find any reason to extend MainActivity here

    //also you need a constructor (except if you are using a static method)
    public void ButtonCalculation (){

    }

    public void calculate(ViewGroup root, Context context){

        Spinner spinnerOmadas=(Spinner) root.findViewById(R.id.spinnerOmadas);
        String t1= spinnerOmadas.getSelectedItem().toString();

        Toast.makeText(context, t1, Toast.LENGTH_SHORT).show();

    }

}

在你的 MainActivity 中

final ViewGroup root= (ViewGroup) ((ViewGroup) this
            .findViewById(android.R.id.content)).getChildAt(0);
ButtonCalculation b1 = new ButtonCalculation ();
b1.calculate(root, getApplicationContext());

【讨论】:

  • 我只扩展了 MainActivity,因为我希望能够更轻松地从 mainactivity 的 xml 中解析微调器和其他所有内容。尝试了您的代码,它给我的唯一错误是“getApplicationContext()”。它无法解决它。
  • 小编辑,现在试试吧。
【解决方案2】:

首先在MainActivity中将微调按钮声明为全局变量:

protected Spinner spinner;

然后在MainActivityonCreate()方法中初始化它。

spinnerOmadas=(Spinner) findViewById(R.id.spinnerOmadas);

然后你可以在你的 buttonCalculation 类中使用它:

String t1= spinner.getSelectedItem().toString();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多