【问题标题】:Crash when calling methods from another class从另一个类调用方法时崩溃
【发布时间】:2015-01-26 11:29:19
【问题描述】:

为了减少不同活动之间的冗余代码,我尝试使用共享方法定义一个帮助类,并在我需要时调用它,例如,Calling methods from other classes in Android 这里。还是不能让它工作。这段代码有什么问题?

helper.class(我为操作栏设置了一个自定义视图并定义了向上意图)

public class helper extends Activity {


public void loadActionBar(ActionBar ab, int icon, int t) { 
    ab.setCustomView(R.layout.custom_actionbar); 
    View v = ab.getCustomView();         

    TextView title = (TextView)v.findViewById(R.id.ab_title); 
    title.setText(getText(t)); 

    ImageView logo = (ImageView)v.findViewById(R.id.ab_logo);
    logo.setImageResource(icon);

    logo.setOnClickListener( new View.OnClickListener() {
                                 @Override
                                 public void onClick(View v) {
                                     Intent i = getParentActivityIntent();
                                     startActivity(i); }
                             }
    );

    ab.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_HOME);
    ab.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_TITLE);
    ab.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
}
}

a1.class(我的活动)

public class a1 extends helper { 

private helper helper = new helper();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.a1);

    helper.loadActionBar(getActionBar(), R.drawable.action_back, R.string.title_a1);
}
}

我正在传递所有相关代码。方法 loadActionBar 曾经在扩展 Activity 的 a1 类中工作。 这是我得到的:

11-27 20:19:59.662    7618-7618/com.tinix.prova1 E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.tinix.prova1/com.tinix.prova1.a1}: java.lang.NullPointerException
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2255)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2309)
        at android.app.ActivityThread.access$700(ActivityThread.java:157)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1289)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:176)
        at android.app.ActivityThread.main(ActivityThread.java:5317)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:511)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
        at dalvik.system.NativeStart.main(Native Method)
 Caused by: java.lang.NullPointerException
        at android.content.ContextWrapper.getResources(ContextWrapper.java:89)
        at android.view.ContextThemeWrapper.getResources(ContextThemeWrapper.java:78)
        at android.content.Context.getText(Context.java:323)
        at com.tinix.prova1.helper.loadActionBar(helper.java:21)
        at com.tinix.prova1.a1.onCreate(a1.java:43)
        at android.app.Activity.performCreate(Activity.java:5326)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1097)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2218)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2309)
            at android.app.ActivityThread.access$700(ActivityThread.java:157)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1289)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:176)
            at android.app.ActivityThread.main(ActivityThread.java:5317)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
            at dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

  • 尝试制作你的方法static
  • 我不能,因为它有非静态方法(例如 getText)
  • 用 PascalCase 规则命名你的类(“Helper”而不是“helper”)。您是否在清单文件中声明了活动?!
  • 当然声明了 a1,我应该对 Helper 做同样的事情吗?
  • 你的 loadActionBar 方法中哪一行是 21?

标签: android methods helper


【解决方案1】:

我终于解决了自己的问题。

通过在主活动中不显式调用 Helper 类,它可以正常工作 - 无论是使用 private Helper helper = new Helper();,还是调用存储在 Helper 中的方法时。

例如,在我的 onCreate 中,我只调用 loadActionBar - 而不是 Helper.loadActionBar。 现在对我来说这看起来很明显,因为我的活动实际上是 extends Helper 类。

不过,我不知道为什么我在 title.setText(getText(t)); 上检测到 null 问题。我看不出这有什么关系。 如果有人可以提供答案,这对其他用户会更有用。我会等待一段时间才能接受这个答案。

【讨论】:

  • 我接受这个答案,因为它确实解决了问题。
【解决方案2】:

因为你的例外是:

无法开始活动 组件信息{com.tinix.prova1/com.tinix.prova1.a1}: java.lang.NullPointerException

一定要在你的布局里面:R.layout.custom_actionbar TextView,ID 为 ab_title

<TextView
        android:id="@+id/ab_title"

title 在这里为空:

title.setText(getText(t)); 

【讨论】:

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