4

我在我的Fragment中有一个ImageView,其中设置了onClick Listener某些设备上的java.lang.NoClassDefFoundError异常

public class TutorialFragment extends Fragment { 

private TutorialAdapter tutorialAdapter; 
private TutorialFragment tutorialFragment; 
private SplashActivity splashActivity; 
private RelativeLayout firstPageRelativeLayout,secondPageRelativeLayout,thirdPageRelativeLayout; 
private ImageView backgroundImageView,facebookLoginButton,dekkohLogoImageView; 
private ProgressDialogHandler progressDialogHandler; 
private AlertDialogHandler alertDialogHandler; 
private TextView firstPageTextView,secondPageTextView,thirdPageTextView,facebookPrivacyText,facebookDescriptionText; 


@Override 
public View onCreateView(LayoutInflater layoutInflater,ViewGroup container, Bundle savedInstanceState) { 

    super.onCreateView(layoutInflater,container,savedInstanceState); 

    tutorialFragment=this; 
    splashActivity = (SplashActivity) getActivity(); 

    View v = layoutInflater.inflate(R.layout.tutorial_fragment,container,false); 
    firstPageRelativeLayout = (RelativeLayout) v.findViewById(R.id.firstScreenRelativeLayout); 
    secondPageRelativeLayout = (RelativeLayout) v.findViewById(R.id.secondScreenRelativeLayout); 
    thirdPageRelativeLayout = (RelativeLayout) v.findViewById(R.id.thirdScreenRelativeLayout); 
    backgroundImageView = (ImageView) v.findViewById(R.id.tutorialImageView); 
    facebookLoginButton = (ImageView) v.findViewById(R.id.facebook_login_button); 
    dekkohLogoImageView = (ImageView) v.findViewById(R.id.dekkohLogoImage); 

    firstPageTextView = (TextView) v.findViewById(R.id.firstPageTextView); 
    secondPageTextView = (TextView) v.findViewById(R.id.secondPageTextView); 
    thirdPageTextView = (TextView) v.findViewById(R.id.thirdPageTextView); 
    facebookPrivacyText = (TextView) v.findViewById(R.id.facebookPrivacyText); 
    facebookDescriptionText = (TextView) v.findViewById(R.id.facebookDescriptionText); 

    int currentIndex = (int) this.getArguments().getSerializable("tutorial"); 
    switch (currentIndex){ 
     case 0: 
      firstPageRelativeLayout.setVisibility(View.VISIBLE); 
      secondPageRelativeLayout.setVisibility(View.GONE); 
      thirdPageRelativeLayout.setVisibility(View.GONE); 
      Picasso.with(splashActivity).load(R.drawable.tutorial_1).priority(Picasso.Priority.HIGH).fit().into(backgroundImageView); 
      Picasso.with(splashActivity).load(R.drawable.dekkoh_logo_tutorial).priority(Picasso.Priority.HIGH).fit().into(dekkohLogoImageView); 
      break; 
     case 1: 
      firstPageRelativeLayout.setVisibility(View.GONE); 
      secondPageRelativeLayout.setVisibility(View.VISIBLE); 
      thirdPageRelativeLayout.setVisibility(View.GONE); 
      Picasso.with(splashActivity).load(R.drawable.tutorial_2).priority(Picasso.Priority.HIGH).fit().into(backgroundImageView); 

      break; 
     case 2: 
      firstPageRelativeLayout.setVisibility(View.GONE); 
      secondPageRelativeLayout.setVisibility(View.GONE); 
      thirdPageRelativeLayout.setVisibility(View.VISIBLE); 
      Picasso.with(splashActivity).load(R.drawable.tutorial_3).priority(Picasso.Priority.HIGH).fit().into(backgroundImageView); 
      Picasso.with(splashActivity).load(R.drawable.fb_login_btn).fit().into(facebookLoginButton); 

      break; 
    } 
    final ArrayList<String> permissions = new ArrayList<String>(); 
    progressDialogHandler = ProgressDialogHandler.getInstance(); 
    alertDialogHandler = AlertDialogHandler.getInstance(); 


    facebookLoginButton.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 

       // setting facebook permission 
       permissions.add("email"); 
       // permissions.add("user_location"); 
       permissions.add("user_friends"); 
       progressDialogHandler.showCustomProgressDialog(splashActivity); 

       final JSONObject jb = new JSONObject(); 

       Session.openActiveSession(splashActivity, true, 
         permissions, new Session.StatusCallback() { 

          @SuppressWarnings("deprecation") 
          @Override 
          public void call(final Session session, 
              SessionState state, Exception exception) { 

           if (session.isOpened()) { 

            Request.executeMeRequestAsync(
              session, 
              new Request.GraphUserCallback() { 

               @Override 
               public void onCompleted(
                 GraphUser user, 
                 Response response) { 
                if (user != null) { 


                 String emaila = user 
                   .asMap() 
                   .get("email") 
                   .toString(); 
                 String userId = user 
                   .getId(); 
                 String name1 = user 
                   .getName(); 

                 try { 

                  jb.put("provider", 
                    "Facebook"); 
                  jb.put("user_id", 
                    userId.toString()); 
                  String token = session 
                    .getAccessToken() 
                    .toString(); 
                  jb.put("token", 
                    token); 

                  Log.d("f b login ", 
                    jb.toString()); 

                  // clear seesion 
                  // details and 
                  // close 
                  session.closeAndClearTokenInformation(); 
                  new LoginTheUser(
                    token, 
                    user.getId()) 
                    .execute(); 

                 } catch (JSONException e) { 
                  // Toast.makeText(getApplicationContext(), 
                  // e.getLocalizedMessage(), 
                  // Toast.LENGTH_SHORT).show(); 
                  e.printStackTrace(); 
                 } 
                } else { 
                 progressDialogHandler 
                   .dismissCustomProgressDialog(splashActivity); 
                 alertDialogHandler 
                   .showToast(
                     splashActivity, 
                     "Facebook Login Failed!"); 
                } 
               } 
              }); 
           } else { 
           } 
          } 
         }); 

      } 
     }); 

    Typeface typeface = Typeface.createFromAsset(getActivity().getAssets(),"fonts/SortsMillGoudy-Regular.ttf"); 
    firstPageTextView.setTypeface(typeface); 
    secondPageTextView.setTypeface(typeface); 
    thirdPageTextView.setTypeface(typeface); 
    facebookDescriptionText.setTypeface(typeface); 
    facebookPrivacyText.setTypeface(typeface); 
    return v; 
} 

这在Nexus,oneplus上运行良好,但在某些设备上出现以下错误。

java.lang.NoClassDefFoundError: com.myapp.fragments.TutorialFragment$1 
     at com.myapp.fragments.TutorialFragment.onCreateView(TutorialFragment.java:135) 
     at android.support.v4.app.Fragment.performCreateView(Fragment.java:1786) 
     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:947) 
     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1126) 
     at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:739) 
     at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1489) 
     at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:486) 
     at android.support.v4.app.FragmentStatePagerAdapter.finishUpdate(FragmentStatePagerAdapter.java:163) 
     at android.support.v4.view.ViewPager.populate(ViewPager.java:1073) 
     at android.support.v4.view.ViewPager.populate(ViewPager.java:919) 
     at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1441) 
     at android.view.View.measure(View.java:16497) 
     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125) 
     at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
     at android.view.View.measure(View.java:16497) 
     at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:719) 
     at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:455) 
     at android.view.View.measure(View.java:16497) 
     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125) 
     at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
     at android.view.View.measure(View.java:16497) 
     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125) 
     at android.support.v7.internal.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:453) 
     at android.view.View.measure(View.java:16497) 
     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125) 
     at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
     at android.view.View.measure(View.java:16497) 
     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125) 
     at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404) 
     at android.widget.LinearLayout.measureVertical(LinearLayout.java:695) 
     at android.widget.LinearLayout.onMeasure(LinearLayout.java:588) 
     at android.view.View.measure(View.java:16497) 
     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125) 
     at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
     at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2291) 
     at android.view.View.measure(View.java:16497) 
     at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1912) 
     at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1109) 
     at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1291) 
     at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:996) 
     at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5600) 
     at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761) 
     at android.view.Choreographer.doCallbacks(Choreographer.java:574) 
     at android.view.Choreographer.doFrame(Choreographer.java:544) 
     at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747) 
     at android.os.Handler.handleCallback(Handler.java:733) 
     at android.os.Handler.dispatchMessage(Handler.java:95) 
     at android.os.Looper.loop(Looper.java:136) 
     at android.app.ActivityThread.main(ActivityThread.java:5001) 
     at java.lang.reflect.Method.invokeNative(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:515) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) 
     at dalvik.system.NativeStart.main(Native Method) 

$ 1表示一个内部类,它是onclicklistener。如果我注释掉onclicklistener代码,则活动和Fragment发射正常。为什么是这样?什么是问题?

+0

你的所有代码在哪里?发布它... –

+0

嗨,我已经添加了我的整个片段的代码 – AniD

+0

嘿,你可以发布你的SplashActivity代码?我面临同样的问题,我想知道原因... –

回答

15

看来你的应用程序达到了65K方法的限制,这是相当出名的Android限制。

编号:https://developer.android.com/tools/building/multidex.html#dev-build

你可以按照上面的链接的解决方案。或简称:

如果您的应用程序类(你扩展类应用),在类中重写attachBaseContext()并调用Multidex.install(本)

否则添加到您的清单:

android:name="android.support.multidex.MultiDexApplication"

里面<application>标记。

如果能解决您的问题,请回复。它实际上解决了我的问题。

+0

是的。我只是扩展Application类并在onCreate()中做了Multidex.install并解决了它。谢谢 – AniD

+0

不客气。我的回答“接受的标记”真的很感激^^。 –

+0

它帮助我在我的应用程序中修复类似的问题。谢谢。 – shahins

相关问题