سؤال

لدي مشكلة لم أتمكن من حلها.عندما أقوم بتخزين العديد من البيانات في نفس الحزمة، يتعطل درج التنقل الخاص بي (العناصر المطابقة لموقع الحزمة).

هذا هو المثال:

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 (استخدم واحدة منها) يعمل التطبيق.!!!والخطأ يقول أن:درج التنقل عند العنصر، انقر فوق استثناء المؤشر الفارغ.

الجزءان اللذان أتلقى منهما البيانات هما:

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

هل أستطيع مساعدتك؟شكرًا لك.

وهنا لوجكات:

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)
هل كانت مفيدة؟

المحلول

بمساعدة FLLO، يمكنني حل مشكلتي.كانت المشكلة بشكل فعال في العربة الرئيسية التي كانت تفعل الكثير من العمل، وهذه طريقة حل مؤشرات الترابط مثل سحر:

في جزء send_bill:
Public Void Settotal (نص السلسلة النهائية) { TextViewPrice.SetteXT (نص)؛ }

giveacodicetagpre.

ثم في جزء القائمة:

1 يعلن الواجهة:

giveacodicetagpre.

2 الزر الذي يرسل البيانات من قائمة جزء إلى Fragment Bill_Dend:

giveacodicetagpre.

وأخيرا في النشاط الرئيسي:

1 الحصول على الحزمة:

giveacodicetagpre.

2 استخدمه عند إنشاء مثيل وإظهار جزء Send_Bill:

giveacodicetagpre.

شكرا فللو للحصول على المساعدة وأتمنى أن يساعد هذا السؤال الآخرين.

نصائح أخرى

كنت أكتب تعليقًا ولكن يبدو أنه قصير جدًا لشرح المشكلات.لذلك سأحاول مساعدتك، ولكن سيكون الأمر صعبًا إذا لم أكن أعرف تصميم تطبيقك، ولكن دعنا نحاول.

أنت تقوم بالكثير من العمل على نشاطك وشظاياك - فأنت تستخدم الكثير من الموارد في حالتك:الذي يسبب أ Shutting Down.

أولاً، يجب عليك إنشاء مثيل لكل جزء.هذا يسمح لك بالحصول على: مكان واحد حيث يمكن تجميع جميع الوسائط التي يستخدمها الجزء ولا يتعين عليك كتابة الكود (مع الحزم) في كل مرة تقوم فيها بإنشاء جزء جديد.
متعلق ب: أفضل الممارسات لإنشاء مثيل لجزء Android جديد
لكل جزء تحتاج إلى إنشاء مثيل، على سبيل المثال في جزء القائمة قم بما يلي:

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;
...    

في وثائق جوجل, ، لديك مثال عظيم على هذا السلوك وأيضا على مشاركة SO هذه.

ثانيًا، ضع في اعتبارك أن الحزمة لها حد: الحد هو 500 كيلو بايت.ومع ذلك، أعتقد أن هذه ليست حالتك هنا فقط بالنسبة لعدد صحيح وسلسلة، ولكن من الجيد معرفة ذلك.
متعلق ب: هل هناك بعض الحدود في حزمة android؟

ثالثًا، قم بإجراء شرط التحقق قبل استبدال الجزء الخاص بك ببيان السجل لمعرفة ما إذا كان Spinner الخاص بك كذلك null.لتجنب NullPointerException في هذا تحتاج إلى إنشاء موضوع الخلفية.أعتقد أن هذا مرتبط بالخطأ: "قد يقوم التطبيق بالكثير من العمل على موضوعها الرئيسي".ربما، أعد كتابة تطبيقك بشكل أخف:استخدم قائمة الخيارات (الافتراضية) في ActionBar للعناصر الثانوية مثل "خيارات أخرى" و"إعدادات" و"تعليمات" و"حول".يمكنك تجنب إنشاء عناصر متعددة وجعل NavigationDrawer أكثر خفة.
يجب عليك التحقق من تخطيطك لمعرفة ما إذا كان القرص الدوار لديه المعرف الصحيح وفي نشاطك إذا كان هو نفسه.لست متأكدًا حقًا ولكن يمكنك محاولة عمل موضوع جديد لعرض الجزء الخاص بك (لم أختبر ذلك، لذلك لا أعرف حقًا ما إذا كان بإمكانك ذلك):

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

ومع ذلك، أعتقد أن الحل الصحيح هو جعل نشاطك أخف.

وآمل حقا أن تساعدك.
حظا سعيدا وتطوير جيد.

ملحوظة:سيكون من الأفضل للأسئلة التالية (إذا كان عليك ذلك) أن تكتب سياق تطبيقك بشكل جيد:ماذا ستفعل، ما حاولت، ما هو التطبيق.لأنني لا أستطيع معرفة كيف بنيت هذا.ومع ذلك، ليس عليك أن تخبر كل السياق (في بعض الأحيان تحتوي المشاريع على أسرار ^^) ولكن فقط القليل لفهم الخطأ الذي يحدث.على أي حال...

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top