2015-10-07 204 views
-2

當我嘗試在framelayout中加載片段時,應用程序崩潰並在log cat中顯示「資源未找到異常」。 當應用程序進行服務調用並嘗試多次加載片段時,我收到異常。

我已經在Google上搜索了這個問題,但沒有一篇文章或答案能幫助我。

Logtrace:

10-08 05:38:25.866: E/AndroidRuntime(27073): android.content.res.Resources$NotFoundException: Unable to find resource ID #0x7d0 
10-08 05:38:25.866: E/AndroidRuntime(27073): at android.content.res.Resources.getResourceName(Resources.java:3192) 
10-08 05:38:25.866: E/AndroidRuntime(27073): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:896) 
10-08 05:38:25.866: E/AndroidRuntime(27073): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1082) 
10-08 05:38:25.866: E/AndroidRuntime(27073): at android.app.BackStackRecord.run(BackStackRecord.java:833) 
10-08 05:38:25.866: E/AndroidRuntime(27073): at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1467) 
10-08 05:38:25.866: E/AndroidRuntime(27073): at android.app.FragmentManagerImpl$1.run(FragmentManager.java:452) 
10-08 05:38:25.866: E/AndroidRuntime(27073): at android.os.Handler.handleCallback(Handler.java:739) 
10-08 05:38:25.866: E/AndroidRuntime(27073): at android.os.Handler.dispatchMessage(Handler.java:95) 
10-08 05:38:25.866: E/AndroidRuntime(27073): at android.os.Looper.loop(Looper.java:145) 
10-08 05:38:25.866: E/AndroidRuntime(27073): at android.app.ActivityThread.main(ActivityThread.java:5832) 
10-08 05:38:25.866: E/AndroidRuntime(27073): at java.lang.reflect.Method.invoke(Native Method) 
10-08 05:38:25.866: E/AndroidRuntime(27073): at java.lang.reflect.Method.invoke(Method.java:372) 
10-08 05:38:25.866: E/AndroidRuntime(27073): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1388) 
10-08 05:38:25.866: E/AndroidRuntime(27073): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1183) 

代碼:

final FrameLayout frame = new FrameLayout(context); 
    frame.setId((i+1000)); // since frame layout added at runtime in loop i have added iteration value with 1000 to get unique id. 
final Fragment newFragment = new Fragment() 
mContext.getFragmentManager().beginTransaction().add((i +1000) ,newFragment).commitAllowingStateLoss(); 

能否請你幫我解決這個問題。

+0

你不能這樣'frame.setId((I + 1000))自己使用特定的ID;'。 – starkshang

+0

我只是爲框架佈局設置隨機ID,併爲框架佈局添加片段。它的工作正常,如果用戶界面更新單次定時服務調用如果服務調用多次(如果第二個服務在第一次服務完成之前),那麼應用程序崩潰與資源未發現異常。 – deepa

+0

我認爲首先你應該找到id#0x7d0指的是什麼。是你的FrameLayout框架或newFragment或其他。 – starkshang

回答

0

這裏的問題不在於兩個不同的服務正在運行,因此你會崩潰。

你的例外很清楚說明了ResourceNotFoundException。這意味着framelayout不是用給定的id創建的。

所以請找我下面的代碼可以解決你的問題:

FragmentManager fragmentManager = getFragmentManager(); 
FragmentTransaction fragmentTransaction; 
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT, Gravity.CENTER); 

for(int i=0;i<size();i++){ 
    FrameLayout layoutMain = new FrameLayout(this); 
    layoutMain.setId(Utils.generateViewId()); 
    layoutMain.setLayoutParams(params); 

    fragmentTransaction = fragmentManager.beginTransaction(); 
    Fragment newFragment = new Fragment() 
    fragmentTransaction.add(layoutMain.getId(), newFragment, "HELLO"); 
    fragmentTransaction.commit(); 
} 

因此,IDS的建立將搭載Android只有17歲以上的API版本來完成。 解決方法更低版本低於:

public class Utils{ 
    private static final AtomicInteger sNextGeneratedId = new AtomicInteger(1); 

    public static int generateViewId() { 
     if (Build.VERSION.SDK_INT < 17) { 
      for (;;) { 
       final int result = sNextGeneratedId.get(); 
       // aapt-generated IDs have the high byte nonzero; clamp to the range under that. 
       int newValue = result + 1; 
       if (newValue > 0x00FFFFFF) { 
        newValue = 1; // Roll over to 1, not 0. 
     } 
       if (sNextGeneratedId.compareAndSet(result, newValue)) { 
        return result; 
       } 
      } 
     } else { 
      return View.generateViewId(); 
     } 
    } 
} 
+0

在加載fragment時,崩潰並非一直髮生。我試圖在framelayout中加載片段,它看起來像carosuel效果。當我從基本片段(我正在加載數據)導航到其他片段,並返回到基本片段,仍然數據不是來自服務器,現在數據來自服務器並嘗試加載片段應用程序崩潰與資源不是發現異常。 – deepa

相關問題