2 yiranwujixian yiranwujixian 于 2012.12.29 15:19 提问

android面向对象中不能重用方法

在我的应用中我不能重用我已经在ArabicUtility类中声明的方法。我想要做的是用Arabicutility来安排一个阿拉伯语的文本。因此,我需要做的是给已经在Arabicutility类中声明的方法传递字符串并进行转换
我想这个在面向对象中是有一些困难的,所以希望能有人帮我改一下。
这个是我在Arabicutility类中加的方法

public void addTranslate(int rid, TextView txt1) {
        String textv = getResources().getString(rid);
        txt1.setText(ArabicUtilities.reshapeSentence(textv));
    //  Typeface typeFace=Typeface.createFromAsset(getAssets(),"fonts/DroidNaskhBold.ttf");
    //  txt1.setTypeface(typeFace);

    }

因为getResources()是非静态的,所以我不能将这个方法声明成静态的。因为我用的是android方法,所以我不得不从Activity中扩展。原始的它不是这么定义的。
这个就是我在其他activity类中用的上边的方法

arbic.addTranslate(R.string.butt18title1, txt1);
arbic.addTranslate(R.string.butt18desc1, txt2);but When I run the programe it crashes when I go to above activities.

这个是 log cat

12-29 10:02:32.561: E/AndroidRuntime(951): FATAL EXCEPTION: main
12-29 10:02:32.561: E/AndroidRuntime(951): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.xxxx.xxx/com.xxxx.xxx.ShowMessageActivity}: java.lang.NullPointerException
12-29 10:02:32.561: E/AndroidRuntime(951):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059)
12-29 10:02:32.561: E/AndroidRuntime(951):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
12-29 10:02:32.561: E/AndroidRuntime(951):  at android.app.ActivityThread.access$600(ActivityThread.java:130)
12-29 10:02:32.561: E/AndroidRuntime(951):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
12-29 10:02:32.561: E/AndroidRuntime(951):  at android.os.Handler.dispatchMessage(Handler.java:99)
12-29 10:02:32.561: E/AndroidRuntime(951):  at android.os.Looper.loop(Looper.java:137)
12-29 10:02:32.561: E/AndroidRuntime(951):  at android.app.ActivityThread.main(ActivityThread.java:4745)
12-29 10:02:32.561: E/AndroidRuntime(951):  at java.lang.reflect.Method.invokeNative(Native Method)
12-29 10:02:32.561: E/AndroidRuntime(951):  at java.lang.reflect.Method.invoke(Method.java:511)
12-29 10:02:32.561: E/AndroidRuntime(951):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
12-29 10:02:32.561: E/AndroidRuntime(951):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
12-29 10:02:32.561: E/AndroidRuntime(951):  at dalvik.system.NativeStart.main(Native Method)
12-29 10:02:32.561: E/AndroidRuntime(951): Caused by: java.lang.NullPointerException
12-29 10:02:32.561: E/AndroidRuntime(951):  at android.content.ContextWrapper.getResources(ContextWrapper.java:81)
12-29 10:02:32.561: E/AndroidRuntime(951):  at com.xxxx.xxx.ArabicUtilities.addTranslate(ArabicUtilities.java:252)
12-29 10:02:32.561: E/AndroidRuntime(951):  at com.xxxx.xxx.ShowMessageActivity.onCreate(ShowMessageActivity.java:184)
12-29 10:02:32.561: E/AndroidRuntime(951):  at android.app.Activity.performCreate(Activity.java:5008)
12-29 10:02:32.561: E/AndroidRuntime(951):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
12-29 10:02:32.561: E/AndroidRuntime(951):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)
12-29 10:02:32.561: E/AndroidRuntime(951):  ... 11 more

2个回答

Sueyexin
Sueyexin   2012.12.29 16:15
已采纳

不需要声明为静态addTranslate获得资源在非活动类你只需要通过当前活动上下文通过使用非活动类构造函数或通过在方法为:
在non activity类中不需要声明addTranslate为静态来获得Resources,你只需要用non activity类构造函数来传递 Current Activity Context,或者是在方法中传递:

public void addTranslate(int rid, TextView txt1,Context context) {
        String textv = context.getResources().getString(rid);
        txt1.setText(ArabicUtilities.reshapeSentence(textv));

    }

现在你从activity类中调用addTranslate:

arbic.addTranslate(R.string.butt18title1, txt1,Your_Current_Activity.this);
arbic.addTranslate(R.string.butt18desc1, txt2,Your_Current_Activity.this);
yiranwujixian
yiranwujixian 完美,谢谢!
接近 5 年之前 回复
niangzhi
niangzhi   2012.12.29 16:34

LogCat显示在ArabicUtility中的Context是无效的。试试用TextView's Context

public void addTranslate(int rid, TextView txt1) {
    String textv = txt1.getContext().getResources().getString(rid);
    txt1.setText(ArabicUtilities.reshapeSentence(textv));
}

因为我用的是android方法,所以我不得不从Activity中扩展。原始的它不是这么定义的。
这个就是我在其他activity类中用的上边的方法

如果ArabicUtility不是活动的activity,那么你不应该扩展activity,你应该这样:

public class ArabicUtility {
    private Context context;

    public ArabicUtility(Context context) {
        this.context = context;
    }

    ...
    public void addTranslate(int rid, TextView txt1) {
        String textv = context.getResources().getString(rid);
        txt1.setText(ArabicUtilities.reshapeSentence(textv));
    }
}

在你当前activity中用:

arbic = new ArabicUtility(this);
arbic.addTranslate(R.string.butt18title1, txt1);
arbic.addTranslate(R.string.butt18desc1, txt2);
yiranwujixian
yiranwujixian 谢谢,你的答案让我省了很多时间,而且还从中学到了东西
接近 5 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!