Problema de implementación de fragmentos Android

Aquí está mi xml para mi fragmento:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.thenewjonathan.foodtracker.fragments.FoodItemDisplay" > <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="50dp" android:textStyle="bold" android:text="blank" android:id="@+id/foodItemNameView" android:gravity="center" android:layout_gravity="top|left|center" android:textAlignment="center"/> <ImageView android:contentDescription="@string/foodPicture" android:layout_width="241dp" android:layout_height="241dp" android:layout_gravity="left|center_vertical" android:background="@color/material_blue_grey_800" android:layout_below="@id/foodItemNameView" android:id="@+id/foodPic" /> <RelativeLayout android:layout_width="140dp" android:layout_height="241dp" android:layout_alignParentRight="true" android:layout_below="@id/foodItemNameView" android:layout_gravity="end|center_vertical" android:gravity="center" android:id="@+id/checkBoxGroup" > <CheckBox android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Monday" android:id="@+id/mondayBox" android:layout_alignParentTop="true" android:layout_alignParentStart="true"/> <CheckBox android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Tuesday" android:id="@+id/tuesdayBox" android:layout_below="@id/mondayBox" android:layout_alignParentStart="true"/> <CheckBox android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Wednesday" android:id="@+id/wednesdayBox" android:layout_below="@id/tuesdayBox" android:layout_alignParentStart="true"/> <CheckBox android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Thursday" android:id="@+id/thursdayBox" android:layout_below="@id/wednesdayBox" android:layout_alignParentStart="true"/> <CheckBox android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Friday" android:id="@+id/fridayBox" android:layout_below="@id/thursdayBox" android:layout_alignParentStart="true"/> <CheckBox android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Saturday" android:id="@+id/saturdayBox" android:layout_below="@id/fridayBox" android:layout_alignParentStart="true"/> <CheckBox android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Sunday" android:id="@+id/sundayBox" android:layout_below="@id/saturdayBox" android:layout_alignParentStart="true"/> </RelativeLayout> 

Aquí está mi archivo java para el fragmento: (FoodItem es sólo un objeto personalizado que estoy usando para almacenar la información sobre cada alimento que representa el fragmento)

 package com.thenewjonathan.foodtracker.fragments; import android.app.Activity; import android.app.Fragment; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.CheckBox; import android.widget.ImageView; import android.widget.TextView; import com.thenewjonathan.foodtracker.R; import com.thenewjonathan.foodtracker.enums.GoodBad; import com.thenewjonathan.foodtracker.objects.FoodItem; public class FoodItemDisplay extends Fragment { private static final String FOOD_ITEM_NAME = "blank"; private FoodItem foodItem; private String foodItemName; private ImageView image; private TextView itemNameView; private CheckBox mondayBox; private CheckBox tuesdayBox; private CheckBox wednesdayBox; private CheckBox thursdayBox; private CheckBox fridayBox; private CheckBox saturdayBox; private CheckBox sundayBox; public FoodItemDisplay() { setFoodItem(new FoodItem("blank", GoodBad.HEALTHY, "blank")); } public static FoodItemDisplay newInstance(String inFoodItemName) { FoodItemDisplay fragment = new FoodItemDisplay(); Bundle args = new Bundle(); args.putString(FOOD_ITEM_NAME, inFoodItemName); fragment.setArguments(args); return fragment; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (getArguments() != null) { foodItemName = getArguments().getString(FOOD_ITEM_NAME); } itemNameView = (TextView) itemNameView.findViewById(R.id.foodItemNameView); image = (ImageView) image.findViewById(R.id.foodPic); mondayBox = (CheckBox) mondayBox.findViewById(R.id.mondayBox); tuesdayBox = (CheckBox) tuesdayBox.findViewById(R.id.tuesdayBox); wednesdayBox = (CheckBox) wednesdayBox.findViewById(R.id.wednesdayBox); thursdayBox = (CheckBox) thursdayBox.findViewById(R.id.thursdayBox); fridayBox = (CheckBox) fridayBox.findViewById(R.id.fridayBox); saturdayBox = (CheckBox) saturdayBox.findViewById(R.id.saturdayBox); sundayBox = (CheckBox) sundayBox.findViewById(R.id.sundayBox); if (foodItem != null) { setValues(); } } public void setValues() { if(itemNameView == null) { return; } itemNameView.setText(foodItem.getName()); image.setImageResource(image.getResources() .getIdentifier(foodItem.getImgName(), "drawable", this.getClass().getPackage().toString())); mondayBox.setChecked(foodItem.isMonday()); tuesdayBox.setChecked(foodItem.isTuesday()); wednesdayBox.setChecked(foodItem.isWednesday()); thursdayBox.setChecked(foodItem.isThursday()); fridayBox.setChecked(foodItem.isFriday()); saturdayBox.setChecked(foodItem.isSaturday()); sundayBox.setChecked(foodItem.isSunday()); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.food_item_display, container, false); } @Override public void onAttach(Activity activity) { super.onAttach(activity); } @Override public void onDetach() { super.onDetach(); } public FoodItem getFoodItem() { return foodItem; } public void setFoodItem(FoodItem foodItem) { this.foodItem = foodItem; } public String getFoodItemName() { return foodItemName; } public void setFoodItemName(String foodItemName) { this.foodItemName = foodItemName; } } 

Aquí está la clase que estoy poniendo los fragmentos en su lugar con:

 public class HealthyFoods extends Activity { private ArrayList<FoodItem> foodItemList; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.healthy_foods); foodItemList = new ArrayList<FoodItem>(); foodItemList.add(new FoodItem("Turkey Burger", GoodBad.HEALTHY, "burger")); FragmentManager fm = getFragmentManager(); FragmentTransaction ft = fm.beginTransaction(); for(FoodItem fi : foodItemList) { FoodItemDisplay fid = FoodItemDisplay.newInstance(fi.getName()); fid.setFoodItem(fi); fid.setValues(); ft.add(R.id.healthyTab, fid); } ft.commit(); } } 

Cuando lo ejecuto, estoy obteniendo este seguimiento de la pila:

 java.lang.NullPointerException at com.android.ddmlib.JdwpPacket.writeAndConsume(JdwpPacket.java:213) at com.android.ddmlib.Client.sendAndConsume(Client.java:675) at com.android.ddmlib.HandleHello.sendHELO(HandleHello.java:195) at com.android.ddmlib.HandleHello.sendHelloCommands(HandleHello.java:66) at com.android.ddmlib.Client.getJdwpPacket(Client.java:772) at com.android.ddmlib.MonitorThread.processClientActivity(MonitorThread.java:317) at com.android.ddmlib.MonitorThread.run(MonitorThread.java:263) 

Yo estaba haciendo bien en este proyecto porque podía ver la pila de seguimiento en el código que escribí y encontrar errores. Pero cuando golpeo este, me está dando pistas de pila para el código que no escribí. Sé que esto indica que he puesto algo mal, pero Google no está siendo muy útil en este caso y he estado sobre este código varias veces y no veo nada malo sobre la base de la documentación de cada uno de los objetos y clases I Estoy usando … ¿Alguna vez alguien se topó con esto antes? Tal vez tener algunas ideas de qué mirar? ¿O simplemente tener una respuesta? Jajaja Estoy utilizando intellij-idea (no estudios android).

¡Gracias! Jon

* DE LOS COMENTARIOS A CONTINUACIÓN * Aquí está la salida del registro de anuncios:

 DeviceMonitor: Adb rejected connection to client '27925': closed DeviceMonitor: Adb rejected connection to client '27952': closed DeviceMonitor: Adb rejected connection to client '28560': closed DeviceMonitor: Adb rejected connection to client '31166': closed DeviceMonitor: Adb rejected connection to client '31790': closed DeviceMonitor: Adb rejected connection to client '32138': closed DeviceMonitor: Adb rejected connection to client '578': closed DeviceMonitor: Adb rejected connection to client '578': closed ddms: null java.lang.NullPointerException at com.android.ddmlib.JdwpPacket.writeAndConsume(JdwpPacket.java:213) at com.android.ddmlib.Client.sendAndConsume(Client.java:675) at com.android.ddmlib.HandleHello.sendHELO(HandleHello.java:195) at com.android.ddmlib.HandleHello.sendHelloCommands(HandleHello.java:66) at com.android.ddmlib.Client.getJdwpPacket(Client.java:772) at com.android.ddmlib.MonitorThread.processClientActivity(MonitorThread.java:317) at com.android.ddmlib.MonitorThread.run(MonitorThread.java:263) ddms: null java.lang.NullPointerException at com.android.ddmlib.JdwpPacket.writeAndConsume(JdwpPacket.java:213) at com.android.ddmlib.Client.sendAndConsume(Client.java:675) at com.android.ddmlib.HandleHello.sendHELO(HandleHello.java:195) at com.android.ddmlib.HandleHello.sendHelloCommands(HandleHello.java:66) at com.android.ddmlib.Client.getJdwpPacket(Client.java:772) at com.android.ddmlib.MonitorThread.processClientActivity(MonitorThread.java:317) at com.android.ddmlib.MonitorThread.run(MonitorThread.java:263) DeviceMonitor: Adb rejected connection to client '832': closed DeviceMonitor: Adb rejected connection to client '3083': closed DeviceMonitor: Adb rejected connection to client '5816': closed DeviceMonitor: Adb rejected connection to client '5847': closed DeviceMonitor: Adb rejected connection to client '6144': closed PropertyFetcher: AdbCommandRejectedException getting properties for device LGUS990611b931f: device offline PropertyFetcher: AdbCommandRejectedException getting properties for device LGUS990611b931f: device unauthorized. Please check the confirmation dialog on your device. PropertyFetcher: AdbCommandRejectedException getting properties for device LGUS990611b931f: device unauthorized. Please check the confirmation dialog on your device. PropertyFetcher: AdbCommandRejectedException getting properties for device LGUS990611b931f: device unauthorized. Please check the confirmation dialog on your device. 

Nuevo error ahora después de reconfigurar: Ok … nuevo error ahora ->

 Caused by: java.lang.IllegalArgumentException: No view found for id 0x7f09005a (com.thenewjonathan.foodtracker:id/healthyTab) for fragment FoodItemDisplay{b5abff #0 id=0x7f09005a} at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:886) at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067) at android.app.BackStackRecord.run(BackStackRecord.java:833) at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1452) at android.app.Activity.performStart(Activity.java:6035) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2269)            at android.app.ActivityThread.startActivityNow(ActivityThread.java:2128)            at android.app.LocalActivityManager.moveToState(LocalActivityManager.java:135)            at android.app.LocalActivityManager.startActivity(LocalActivityManager.java:347)            at android.widget.TabHost$IntentContentStrategy.getContentView(TabHost.java:756)            at android.widget.TabHost.setCurrentTab(TabHost.java:420)            at android.widget.TabHost.addTab(TabHost.java:247)            at com.thenewjonathan.foodtracker.MainMenu.onCreate(MainMenu.java:30)            at android.app.Activity.performCreate(Activity.java:6020)            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2259)            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2368)            at android.app.ActivityThread.access$800(ActivityThread.java:149)            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1284)            at android.os.Handler.dispatchMessage(Handler.java:102)            at android.os.Looper.loop(Looper.java:135)            at android.app.ActivityThread.main(ActivityThread.java:5299)            at java.lang.reflect.Method.invoke(Native Method)            at java.lang.reflect.Method.invoke(Method.java:372) 

Y está ocurriendo en el oncreate de mi menú principal que está agregando las lengüetas encendido cuando intento agregar la lengüeta "sana" al tabhost:

 public class MainMenu extends ActivityGroup { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.main_menu); TabHost container = (TabHost) findViewById(R.id.mainTabHost); container.setup(this.getLocalActivityManager()); TabSpec healthy = container.newTabSpec("Healthy Foods").setContent(new Intent(this, HealthyFoods.class)) .setIndicator("Healthy Foods"); TabSpec unHealthy = container.newTabSpec("Unhealthy Foods").setContent(new Intent(this, UnHealthyFoods.class)) .setIndicator("Unhealthy Foods"); container.addTab(healthy); container.addTab(unHealthy); } } 

Está haciendo referencia a sus puntos de vista erróneos dentro de onCreate() en la clase de fragmentos. Usted debe obtener sus referencias dentro onCreateView() haciendo algo como esto:

 View view = inflater.inflate(R.layout.food_item_display, container, false); itemNameView = (TextView) view.findViewById(R.id.foodItemNameView); image = (ImageView) view.findViewById(R.id.foodPic); 

La forma en que lo han escrito, que está tratando de hacer referencia a las vistas antes de que les haya dado un valor, de ahí el NPE. Si food_item_display es de hecho el diseño padre de todos estos elementos, debería usar esa vista para encontrar los otros por ID, como he mostrado aquí.

Debe utilizar onActivityCreated o onCreateView para obtener referencias como el ejemplo siguiente. No puede utilizar onCreate para hacerlo, ya que el fragmento sólo se creará después de onCreateView .

 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.food_item_display, container, false); } @Override public void onActivityCreated(Bundle savedInstanceState){ View _view = getView(); itemNameView = (TextView) _view.findViewById(R.id.foodItemNameView); image = (ImageView) _view.findViewById(R.id.foodPic); mondayBox = (CheckBox) _view.findViewById(R.id.mondayBox); tuesdayBox = (CheckBox) _view.findViewById(R.id.tuesdayBox); wednesdayBox = (CheckBox) _view.findViewById(R.id.wednesdayBox); thursdayBox = (CheckBox) _view.findViewById(R.id.thursdayBox); fridayBox = (CheckBox) _view.findViewById(R.id.fridayBox); saturdayBox = (CheckBox) _view.findViewById(R.id.saturdayBox); sundayBox = (CheckBox) _view.findViewById(R.id.sundayBox); } 

Otro ejemplo:

 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View _view = inflater.inflate(R.layout.food_item_display, container, false); itemNameView = (TextView) _view.findViewById(R.id.foodItemNameView); image = (ImageView) _view.findViewById(R.id.foodPic); mondayBox = (CheckBox) _view.findViewById(R.id.mondayBox); tuesdayBox = (CheckBox) _view.findViewById(R.id.tuesdayBox); wednesdayBox = (CheckBox) _view.findViewById(R.id.wednesdayBox); thursdayBox = (CheckBox) _view.findViewById(R.id.thursdayBox); fridayBox = (CheckBox) _view.findViewById(R.id.fridayBox); saturdayBox = (CheckBox) _view.findViewById(R.id.saturdayBox); sundayBox = (CheckBox) _view.findViewById(R.id.sundayBox); return _view; } 
  • android esperando respuesta del servidor
  • RxJava: Cómo aplicar condicionalmente a los operadores a un observable sin romper la cadena
  • Android - Actualizar el menú de opciones sin llamar a invalidateOptionsMenu ()
  • Android - ¿Está bien poner valores @IntDef dentro de @interface?
  • ¿Es una buena práctica de programación usar campos estáticos de importación?
  • Ejecución fallada para la tarea: app: compileDebugJavaWithJavac en Android Studio
  • java.util.ConcurrentModificationException - ArrayList
  • Trabajo POST Multipart Solicitud con Volley y sin HttpEntity
  • ¿Qué significa 'SRPy' en la documentación de Mockito
  • Android: error al abrir el archivo de rastreo: ningún archivo o directorio de este tipo
  • ¿Es posible crear imágenes de forma programática en Java, Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.