2012-12-29 38 views
3

在我的应用程序不能重用方法我在ArabicUtility类中声明。我的意图是使用阿拉伯语课程来安排阿拉伯语文本。因此,我想要的是将字符串传递给我在Arabicutility类中声明的方法并进行转换。不能再利用方式的Android OOP

我认为这基本上是我OOP的knoweledge的一些问题。所以帮助我纠正这一点。

这里是我添加到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()是一个非static.I有自我用机器人methods.Originally从活动延伸为静态它没有这样定义。

这是我尝试使用上面的其他活动类的方法。

arbic.addTranslate(R.string.butt18title1, txt1); 
arbic.addTranslate(R.string.butt18desc1, txt2); 

但是当我运行程序时,它会崩溃,当我去上面的活动。

这里是日志猫

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 
+0

见这 - > http://stackoverflow.com/a/11449753/185722 –

回答

4

不需要声明addTranslate静态获取资源的非活动类,你只需要通过使用非活性类构造函数或传递作为方法传递电流活动上下文:

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); 
+0

它为什么需要? – newday

+0

我的意思是,当我重用其他类的方法时,我是否必须始终声明上下文? – newday

+0

@MenukaDevinda:因为如果你要访问的用户界面和非活性类,你将需要在所有UI元素存在 –

3

LogCat显示ArabicUtility中的上下文无效。尝试使用TextView的语境下,而不是:

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

我不得不从活动延长,因为我使用Android methods.Originally它不是定义,因此。

这是我尝试使用上面的其他活动类的方法。

如果ArabicUtility不是活跃活动,那么你不应该扩展活动,你应该尝试这样的事:

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)); 
    } 
} 

在你当前活动的使用:

arbic = new ArabicUtility(this); 
arbic.addTranslate(R.string.butt18title1, txt1); 
arbic.addTranslate(R.string.butt18desc1, txt2); 
+0

它为什么需要? – newday

+0

我更新了我的答案,你说得对,ArabicUtility不应该扩展Activity。 – Sam

+0

谢谢山姆!你可以节省很多时间,我可以从你宝贵的答案中解脱出来! – newday