0

我有一個問題,我無法解決。當我將很多數據存儲在同一個包中時,我的導航抽屜(與包的位置匹配的項)崩潰。Bundle android在存儲很多數據時不起作用?

這是例如:

public void SelectItem(int possition) { 

     Fragment fragment = null; 
     Bundle args = new Bundle(); 
     switch (possition) { 

     case 2: 
      fragment = new search(); 
      //args.putString(FragmentThree.ITEM_NAME, dataList.get(possition).getItemName()); 
      //args.putInt(FragmentThree.IMAGE_RESOURCE_ID, dataList.get(possition).getImgResID()); 
      break; 
     case 3: 
      fragment = new com.tutecentral.navigationdrawer.Menu(); 
      String DishText = ((Spinner) findViewById(R.id.spinnerSetting)). getSelectedItem().toString(); 
      args.putString("DishType", DishText); 
      TextView text=(TextView)findViewById(R.id.price); 
      int priceDish=Integer.parseInt(text.getText().toString()); 
      args.putInt("price", priceDish); 
      break; 
     case 4: 
      fragment = new bill_send(); 
      TextView textprice=(TextView)findViewById(R.id.TotalFieldMenu); 
      int priceTotal=Integer.parseInt(textprice.getText().toString()); 
      args.putInt("Total_price", priceTotal); 
      //args.putString(FragmentTwo.ITEM_NAME, dataList.get(possition).getItemName()); 
      //args.putInt(FragmentTwo.IMAGE_RESOURCE_ID, dataList.get(possition).getImgResID()); 
      break; 
     case 5: 
      fragment = new tables(); 
      //args.putString(FragmentThree.ITEM_NAME, dataList.get(possition).getItemName()); 
      //args.putInt(FragmentThree.IMAGE_RESOURCE_ID, dataList.get(possition).getImgResID()); 
      break; 
     case 7: 
      fragment = new about(); 
      //args.putString(FragmentTwo.ITEM_NAME, dataList.get(possition).getItemName()); 
      //args.putInt(FragmentTwo.IMAGE_RESOURCE_ID, dataList.get(possition).getImgResID()); 
      break; 
     case 8: 
      fragment = new setting(); 
      //args.putString(FragmentThree.ITEM_NAME, dataList.get(possition).getItemName()); 
      //args.putInt(FragmentThree.IMAGE_RESOURCE_ID, dataList.get(possition).getImgResID()); 
      break; 
     case 9: 
      fragment = new FragmentOne(); 
      //args.putString(FragmentOne.ITEM_NAME, dataList.get(possition).getItemName()); 
      //args.putInt(FragmentOne.IMAGE_RESOURCE_ID, dataList.get(possition).getImgResID()); 
      break; 
     case 10: 
      fragment = new FragmentTwo(); 
      //args.putString(FragmentTwo.ITEM_NAME, dataList.get(possition).getItemName()); 
      //args.putInt(FragmentTwo.IMAGE_RESOURCE_ID, dataList.get(possition).getImgResID()); 
      break; 
     case 11: 
      fragment = new FragmentThree(); 
      //args.putString(FragmentThree.ITEM_NAME, dataList.get(possition).getItemName()); 
      //args.putInt(FragmentThree.IMAGE_RESOURCE_ID, dataList.get(possition).getImgResID()); 
      break; 
     case 12: 
      fragment = new FragmentOne(); 
      //args.putString(FragmentOne.ITEM_NAME, dataList.get(possition).getItemName()); 
      //args.putInt(FragmentOne.IMAGE_RESOURCE_ID, dataList.get(possition).getImgResID()); 
      break; 
     case 13: 
      fragment = new FragmentThree(); 
      //args.putString(FragmentThree.ITEM_NAME, dataList.get(possition).getItemName()); 
      //args.putInt(FragmentThree.IMAGE_RESOURCE_ID, dataList.get(possition).getImgResID()); 
      break; 
     default: 
      break; 
     } 

     if(com.tutecentral.navigationdrawer.Menu.actionBar!=null){ 
      if (com.tutecentral.navigationdrawer.Menu.actionBar.isShowing()){ 
       com.tutecentral.navigationdrawer.Menu.actionBar.removeAllTabs(); 
      } 

     } 

     fragment.setArguments(args); 
     FragmentManager frgManager = getFragmentManager(); 
     frgManager.beginTransaction().replace(R.id.content_frame, fragment).commit(); 

     mDrawerList.setItemChecked(possition, true); 
     setTitle(dataList.get(possition).getItemName()); 
     mDrawerLayout.closeDrawer(mDrawerList); 

    } 

注意,當我在情形4或3(使用它們1)應用的工作方式刪除束!!!並且錯誤表示:導航抽屜上的項目單擊空指針異常。

其中i收到數據的兩個片段是:

public class bill_send extends Fragment { 

public bill_send(){ 
    // TODO Auto-generated constructor stub 
} 
TextView textViewPrice; 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    View view=inflater.inflate(R.layout.bill_send, container, false); 
    textViewPrice=(TextView) view.findViewById(R.id.produitPriceBill); 
    int priceTotal=getArguments().getInt("Total_price"); 
    textViewPrice.setText(String.valueOf(priceTotal)); 
    return view; 
} 

}

而第二個(菜單()):

final int PriceEdited = getArguments().getInt("price"); 
    final String NameDish=getArguments().getString("DishType"); 
    textViewPrice.setText(String.valueOf(PriceEdited)); 
    price=Integer.parseInt(textViewPrice.getText().toString()); 

誰能幫助?謝謝。

這裏是logcat的:

04-11 18:24:39.102: D/dalvikvm(1069): GC_FOR_ALLOC freed 39K, 5% free 2889K/3016K, paused 53ms, total 56ms 
04-11 18:24:39.322: I/dalvikvm-heap(1069): Grow heap (frag case) to 13.447MB for 11059216-byte allocation 
04-11 18:24:39.382: D/dalvikvm(1069): GC_FOR_ALLOC freed 2K, 1% free 13686K/13820K, paused 55ms, total 55ms 
04-11 18:24:40.992: D/gralloc_goldfish(1069): Emulator without GPU emulation detected. 
04-11 18:24:49.632: I/Choreographer(1069): Skipped 873 frames! The application may be doing too much work on its main thread. 
04-11 18:24:49.982: I/Choreographer(1069): Skipped 40 frames! The application may be doing too much work on its main thread. 
04-11 18:25:12.822: I/Choreographer(1069): Skipped 32 frames! The application may be doing too much work on its main thread. 
04-11 18:25:13.032: I/Choreographer(1069): Skipped 30 frames! The application may be doing too much work on its main thread. 
04-11 18:25:13.242: I/Choreographer(1069): Skipped 39 frames! The application may be doing too much work on its main thread. 
04-11 18:25:13.462: I/Choreographer(1069): Skipped 47 frames! The application may be doing too much work on its main thread. 
04-11 18:25:15.622: D/AndroidRuntime(1069): Shutting down VM 
04-11 18:25:15.622: W/dalvikvm(1069): threadid=1: thread exiting with uncaught exception (group=0xb3af2b90) 
04-11 18:25:15.632: E/AndroidRuntime(1069): FATAL EXCEPTION: main 
04-11 18:25:15.632: E/AndroidRuntime(1069): Process: com.tutecentral.navigationdrawer, PID: 1069 
04-11 18:25:15.632: E/AndroidRuntime(1069): java.lang.NullPointerException 
04-11 18:25:15.632: E/AndroidRuntime(1069):  at com.tutecentral.navigationdrawer.MainActivity.SelectItem(MainActivity.java:130) 
04-11 18:25:15.632: E/AndroidRuntime(1069):  at com.tutecentral.navigationdrawer.MainActivity$DrawerItemClickListener.onItemClick(MainActivity.java:241) 
04-11 18:25:15.632: E/AndroidRuntime(1069):  at android.widget.AdapterView.performItemClick(AdapterView.java:299) 
04-11 18:25:15.632: E/AndroidRuntime(1069):  at android.widget.AbsListView.performItemClick(AbsListView.java:1113) 
04-11 18:25:15.632: E/AndroidRuntime(1069):  at android.widget.AbsListView$PerformClick.run(AbsListView.java:2904) 
04-11 18:25:15.632: E/AndroidRuntime(1069):  at android.widget.AbsListView$3.run(AbsListView.java:3638) 
04-11 18:25:15.632: E/AndroidRuntime(1069):  at android.os.Handler.handleCallback(Handler.java:733) 
04-11 18:25:15.632: E/AndroidRuntime(1069):  at android.os.Handler.dispatchMessage(Handler.java:95) 
04-11 18:25:15.632: E/AndroidRuntime(1069):  at android.os.Looper.loop(Looper.java:137) 
04-11 18:25:15.632: E/AndroidRuntime(1069):  at android.app.ActivityThread.main(ActivityThread.java:4998) 
04-11 18:25:15.632: E/AndroidRuntime(1069):  at java.lang.reflect.Method.invokeNative(Native Method) 
04-11 18:25:15.632: E/AndroidRuntime(1069):  at java.lang.reflect.Method.invoke(Method.java:515) 
04-11 18:25:15.632: E/AndroidRuntime(1069):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:777) 
04-11 18:25:15.632: E/AndroidRuntime(1069):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:593) 
04-11 18:25:15.632: E/AndroidRuntime(1069):  at dalvik.system.NativeStart.main(Native Method) 
+0

請包含您的LogCat Stacktrace。 (「LogCat視圖」中顯示的整個錯誤)。您提供給我們的錯誤並不能說明它是否是Bundle或導致NullPointerException的其他變量。 – chriskvik

+0

我只是編輯問題,謝謝。 – Amine

+0

它是您的** SelectItem()的第130行** – vjdhama

回答

2

在Fllo的幫助下,我可以解決我的問題。有效的問題是在其中做太多的工作主要awtivity,這是後線程解決方案的工作就像一個魅力:

在send_bill片段


公共無效setTotal(最後字符串文本){ textViewPrice。的setText(文本); }

public void sentTotal(){ 
    new MyThread().execute(); 
} 

public class MyThread extends AsyncTask<String, String, String>{ 

    @Override 
    protected String doInBackground(String... strings) { 
     // TODO Auto-generated method stub 
     Bundle b=getArguments(); 
     totalValue=b.getString("Total"); 
     return null; 
    } 

    protected void onPostExecute(String result) { 
     // TODO Auto-generated method stub 
     setTotal(totalValue); 
    } 

} 

然後在菜單片段:

1聲明的接口:

FragSendTotal mCallback; 
public interface FragSendTotal{ 
    public Bundle sendTotal(String text); 
} 

2從片段菜單數據發送到片段bill_dend按鈕:

public void onClick(View v) { 
    switch (v.getId()) { 
    case R.id.commander: 

     tt =totalPrice.getText().toString(); 
     mCallback.sendTotal(tt); 
     break; 

最後在主要活動:

1拿到包:

@Override 
public Bundle sendTotal(String total) { 
    // TODO Auto-generated method stub 
     Bundle bundleFrag=new Bundle(); 
     bundleFrag.putString("Total", total); 
     getFragmentManager().beginTransaction().replace(R.id.content_frame, fragment).addToBackStack(null).commit(); 
     return bundleFrag; 
    } 

2使用它時,實例化和顯示send_bill片段:

fragment.setArguments(sendTotal(com.tutecentral.navigationdrawer.Menu.tt)); 
      frgManager.beginTransaction().add(R.id.content_frame, new bill_send(), "fragBill").commit(); 
      frgManager.beginTransaction().replace(R.id.content_frame, fragment).addToBackStack(null).commit(); 
      ((bill_send) fragment).sentTotal(); 

感謝Fllo的幫助,我希望這個問題會幫助別人。

+0

嗨,Amine,真好!真的很高興幫助你。你應該接受你自己的答案,因爲這解決了你的問題。快樂編碼:) – Fllo

+0

Fllo,你能感謝請看看我的新問題,我會感謝你的幫助。再次感謝您,請原諒我的不便。 – Amine

1

我寫評論,但它似乎太矮了,解釋的問題。所以我會盡力幫助你,但是如果我不知道你的應用程序的設計會很困難,但是我們試試吧。

您正在爲您的活動和碎片做許多工作 - 您的案例中使用的資源過多:導致產生Shutting Down

首先,你應該爲每個片段創建一個實例。這使您可以:一個地方,可以將片段使用的所有參數捆綁在一起,而且每次實例化新片段時不必編寫代碼(帶捆綁包)
相關:Best practice for instantiating a new Android Fragment
對於每一個你需要創建一個實例,例如,在菜單片段做如下片段:

public static Menu newInstance(int price, String type) { 
    Menu frag = new Menu(); 
    Bundle args = new Bundle(); 
    args.putInt("PRICE", price); 
    args.putString("TYPE", type); 
    frag.setArguments(args); 
    return frag; 
} 

這避免你到你的活動中創建一個包。要通過從您的活動的數據,你應該做的:

... 
case 3: 
    String dish_type = ((Spinner) findViewById(R.id.spinnerSetting)).getSelectedItem().toString(); 
    TextView text_price = (TextView) findViewById(R.id.price); 
    int priceDish = Integer.parseInt(text.getText().toString()); 
    fragment = new Menu.newInstance(dish_type, text_price); 
    break; 
...  

Google Documentation,你有此行爲的很好的例子,也對this SO's post

其次,請記住Bundle有一個限制:的限制是500kb。然而,我認爲這不是你的情況,只是一個整數和一個字符串,但是很高興知道這一點。
相關:Is there some limits in android' bundle?

三,做一個日誌語句替換您的片段,看看你的微調是null前的檢查條件。爲了避免這個NullPointerException你需要創建一個後臺線程。我認爲這與錯誤有關:「該應用程序可能在其主線程」上做了太多的工作。也許,重寫你的應用程序更輕:使用ActionBar中的(默認)選項菜單作爲「其他選項」,「設置」,「幫助」和「關於」。您可以避免創建多個項目並使您的NavigationDrawer更輕。
您必須檢查您的佈局,以確定微調器是否擁有正確的ID並且在您的活動中是否相同。我真的不知道,但你可以嘗試做一個新的線程來顯示您的片段(我沒有測試過這一點,所以我真的不知道,如果你能)

final Runnable changeFrag = new Runnable() { 
    public void run() { 
     // launch your fragment here or call a method to do so 
     handler.postDelayed(this, timeout); 
    } 
}; 
handler.postDelayed(changeFrag, timeout); 

然而,我認爲正確的解決方案是讓您的活動更輕鬆。

我真的希望它能幫助你。
祝你好運,好開發。

注意:對於下一個問題(如果您有的話),寫好應用程序的上下文會更好:您要做什麼,嘗試了什麼,應用程序是什麼。因爲我無法弄清楚你是如何構建這個的。然而,你不必告訴所有的情況(有時項目有祕密^^),但只是有點了解發生了什麼問題。無論如何...