0

嗨,我试图从我的 FragmentActivity 中获取一个 int,我有办法做到这一点,但是代码变得非常混乱和冗长,我这样做是为了缩短问题,并且在编辑器中我没有收到任何错误,但是当我运行时它明显崩溃的应用程序。有什么建议么?

不起作用的代码示例

MainActivity mainActivity = ((MainActivity)getActivity());

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.upgrades_fragment, container, false);

    TextView AirFreshenersCost = (TextView) view.findViewById(R.id.AirFreshenersCost );

    if(mainActivity.amountAirFresheners == 5){
        AirFreshenersCost.setText("5");
    }

    return view;
}

日志猫

10-27 22:16:37.333: E/AndroidRuntime(5593): FATAL EXCEPTION: main
10-27 22:16:37.333: E/AndroidRuntime(5593): java.lang.NullPointerException
10-27 22:16:37.333: E/AndroidRuntime(5593): at com.free.dennisg.clickingbad.fragments.UpgradesFragment.onCreateView(UpgradesFragment.java:40)
10-27 22:16:37.333: E/AndroidRuntime(5593): at android.support.v4.app.Fragment.performCreateView(Fragment.java:1478)
10-27 22:16:37.333: E/AndroidRuntime(5593): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:927)
10-27 22:16:37.333: E/AndroidRuntime(5593): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104)
10-27 22:16:37.333: E/AndroidRuntime(5593): at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
10-27 22:16:37.333: E/AndroidRuntime(5593): at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1460)
10-27 22:16:37.333: E/AndroidRuntime(5593): at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:472)
10-27 22:16:37.333: E/AndroidRuntime(5593): at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141)
10-27 22:16:37.333: E/AndroidRuntime(5593): at android.support.v4.view.ViewPager.populate(ViewPager.java:1068)
10-27 22:16:37.333: E/AndroidRuntime(5593): at android.support.v4.view.ViewPager.populate(ViewPager.java:914)
10-27 22:16:37.333: E/AndroidRuntime(5593): at android.support.v4.view.ViewPager$3.run(ViewPager.java:244)
10-27 22:16:37.333: E/AndroidRuntime(5593): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749)
10-27 22:16:37.333: E/AndroidRuntime(5593): at android.view.Choreographer.doCallbacks(Choreographer.java:562)
10-27 22:16:37.333: E/AndroidRuntime(5593): at android.view.Choreographer.doFrame(Choreographer.java:531)
10-27 22:16:37.333: E/AndroidRuntime(5593): at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735)
10-27 22:16:37.333: E/AndroidRuntime(5593): at android.os.Handler.handleCallback(Handler.java:730)
10-27 22:16:37.333: E/AndroidRuntime(5593): at android.os.Handler.dispatchMessage(Handler.java:92)
10-27 22:16:37.333: E/AndroidRuntime(5593): at android.os.Looper.loop(Looper.java:137)
10-27 22:16:37.333: E/AndroidRuntime(5593): at android.app.ActivityThread.main(ActivityThread.java:5289)
10-27 22:16:37.333: E/AndroidRuntime(5593): at java.lang.reflect.Method.invokeNative(Native Method)
10-27 22:16:37.333: E/AndroidRuntime(5593): at java.lang.reflect.Method.invoke(Method.java:525)
10-27 22:16:37.333: E/AndroidRuntime(5593): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:739)
10-27 22:16:37.333: E/AndroidRuntime(5593): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:555)
10-27 22:16:37.333: E/AndroidRuntime(5593): at dalvik.system.NativeStart.main(Native Method)

有效的代码示例

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.upgrades_fragment, container, false);

    TextView AirFreshenersCost = (TextView) view.findViewById(R.id.AirFreshenersCost );

    if(((MainActivity)getActivity()).amountAirFresheners == 5){
        AirFreshenersCost.setText("5");
    }

    return view;
}
4

2 回答 2

0

您可以将 int 作为静态变量存储在 MainActivity 上。然后,您可以引用它而不是引用公共实例变量。

if (MainActivity.AIR_FRESHENER_COUNT == 5) { ...

我认为崩溃的原因是您持有对活动的引用,即使您的片段存在,活动也可能被创建和销毁,因此该引用可能为空(很难说出 NPE 到底是什么在不知道原始文件中的行号)。

于 2013-10-27T21:32:37.260 回答
0

我认为您应该定义一个接口来封装您的活动和片段。作为oop的概念,activity不应该知道她的fragment的细节,fragment也不应该知道她的mother activity。假:

Interface IGetNumber { int getNum();}

class MyActivity : IGetNumber

class MyFragment {
          IGetNumber mNumGetter;

         onAttach(activity){
                If activity is an IGetNumber {
                           mNumGetter = (IGetNumber)activity;
                 }
        }

        any method(){
                If mNumGetter is valid {
                         Call mNumGetter.getNum();
                 }


}
于 2013-10-27T21:50:06.510 回答