8

Oto mój xml dla mojego fragmentu:Android fragment realizacja problem

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

Oto mój plik Java do fragmentu: (FoodItem jest tylko obiekt niestandardowy używam do przechowywania informacji o każdy artykuł spożywczy, że fragment reprezentuje)

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

Oto klasa Kładę fragmentów w miejscu:

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

Kiedy go uruchomić, dostaję ten ślad stosu:

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) 

robiłem ok na tym projekcie, bo mogłam zobaczyć ślad stosu do kodu pisałem i znajdowaniu błędów. Ale kiedy uderzę w to, daje mi stosy śladów kodu, których nie napisałem. Wiem, że to oznacza, że ​​coś źle zrobiłem, ale Google nie jest bardzo pomocny w tej sprawie i kilka razy przejąłem ten kod i nie widzę niczego złego na podstawie dokumentacji każdego z obiektów i klas Używałem ... Czy ktoś kiedyś w to wpadł? Może masz jakieś pomysły na co patrzeć? A może po prostu masz odpowiedź? lol. Używam intellij-idea (nie androidowych studiów).

Dzięki! Jon

* FROM komentarzach poniżej * Oto adb wyjście dziennika:

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. 

New błąd teraz po pewnym przekonfigurowywaniu: Ok ... teraz nowy błędu ->

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) 

I dzieje się w oncreate z mojego menu głównego, który dodaje zakładki, gdy próbuję dodać kartę "zdrowy" do 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); 
    } 
} 
+0

Myślę, że brakuje kilku linii w tym LogCat, dodaj pełną błąd. –

+0

^W końcu logcat poda wiersz z * twojego kodu *, który spowodował błąd, nawet jeśli zdarzył się gdzieś w bibliotece, którą zaimportowałeś (jak to wygląda). – AdamMc331

+1

Sprawdź, w jaki sposób uzyskujesz odniesienie do widoków. 'itemNameView = (TextView) itemNameView ...' rzuci NPE, ponieważ itemNameView nigdy nie było tworzone. – AdamMc331

Odpowiedz

4

Niewłaściwe odniesienie do swoich widoków w klasie onCreate() w klasie fragmentów. należy uzyskać ich referencje wewnątrz onCreateView() robi coś takiego:

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

Droga masz napisane, staramy się odwoływać poglądy przed dałeś im wartości, stąd NPE. Jeśli food_item_display jest w rzeczywistości układem nadrzędnym dla wszystkich tych elementów, powinieneś używać tego widoku, aby znaleźć inne według identyfikatora, tak jak to tutaj pokazałem.

+0

Masz 100% racji .. dzięki za to. Właśnie podłączyłem i dłubałem, pozwalając, aby pomysł zadziałał ... nie wiem, dlaczego moje obiekty są używane do znalezienia widoku ... dziwne. Jednak to nie rozwiązało problemu ... nadal występuje problem. Wstawię pełny tekst mojego logu adb do powyższego komentarza, o który poprosił drugi facet. –

2

Musisz użyć onActivityCreated lub onCreateView, aby uzyskać referencje, takie jak poniższy przykład. W tym celu nie można użyć onCreate, ponieważ fragment zostanie utworzony dopiero po 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); 

} 

Inny przykład:

@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; 
} 
+0

Czy istnieją znaczne różnice między zrobieniem tego w onCreateView() lub onActivityCreated()? – AdamMc331

+0

Trochę. Zobacz http://stackoverflow.com/questions/28929637/difference-and-uses-of-oncreate-oncreateview-and-onactivitycreated-in-fra –

+0

Wystąpił ten sam błąd -> ddms: null java.lang.NullPointerException \t w com.android.ddmlib.JdwpPacket.writeAndConsume (JdwpPacket.java:213) \t w com.android.ddmlib.Client.sendAndConsume (Client.java:675) \t w com.android.ddmlib.HandleHello.sendHELO (HandleHello.java:195) \t w com.android.ddmlib.HandleHello.sendHelloCommands (HandleHello.java:66) \t w com.android.ddmlib.Client.getJdwpPacket (Client.java:772) \t na pl. android.ddmlib.MonitorThread.processClientActivit y (MonitorThread.java:317) \t na com.android.ddmlib.MonitorThread.run (MonitorThread.java:263) –