8

Dưới đây là xml của tôi cho mảnh của tôi:đoạn Android thực hiện vấn đề

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

Dưới đây là file java của tôi cho đoạn: (FoodItem chỉ là một đối tượng tùy chỉnh Tôi đang sử dụng để lưu trữ các thông tin về từng mặt hàng thực phẩm mà các mảnh vỡ đại diện)

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

đây là lớp tôi đặt các mảnh vỡ tại chỗ với:

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

Khi tôi chạy nó, tôi nhận được stack trace này:

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) 

tôi đang làm ok về dự án này bởi vì tôi có thể nhìn thấy dấu vết ngăn xếp vào mã tôi đã viết và tìm lỗi. Nhưng khi tôi nhấn cái này, nó cho tôi đống dấu vết mã mà tôi không viết. Tôi biết rằng điều này cho thấy rằng tôi đã thiết lập sai điều gì đó, nhưng Google không thực sự hữu ích với điều này và tôi đã từng đọc mã này nhiều lần và không thấy bất cứ điều gì sai dựa trên tài liệu cho từng đối tượng và lớp học tôi đang sử dụng ... Có ai từng từng gặp phải điều này trước đây không? Có lẽ có một số ý tưởng về những gì để xem xét? Hoặc chỉ cần thẳng lên có một câu trả lời? lol. Tôi đang sử dụng ý tưởng intellij (không phải studio android).

Cảm ơn! Jon

* TỪ NHẬN XÉT DƯỚI * Dưới đây là các dữ liệu ghi nhận adb:

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. 

lỗi mới bây giờ sau khi một số cấu hình lại: Ok ... lỗi mới bây giờ ->

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) 

Và nó đang xảy ra trong quá trình tạo menu chính của tôi, đó là thêm các tab khi tôi cố gắng thêm tab "khỏe mạnh" vào 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

Tôi nghĩ rằng bạn đang bỏ lỡ một vài dòng trong logcat đó, hãy thêm các lỗi đầy đủ. –

+0

^Cuối cùng logcat sẽ cung cấp cho bạn dòng từ * mã của bạn * gây ra lỗi, ngay cả khi nó xảy ra ở đâu đó trong thư viện mà bạn đã nhập (trông như thế này). – AdamMc331

+1

Nhìn vào cách bạn đang nhận được một tham chiếu đến các quan điểm. 'itemNameView = (TextView) itemNameView ...' sẽ ném một NPE, bởi vì itemNameView không bao giờ được khởi tạo. – AdamMc331

Trả lời

4

Bạn đang tham chiếu các chế độ xem sai bên trong của onCreate() trong lớp phân đoạn. Bạn nên lấy tài liệu tham khảo của họ bên trong onCreateView() làm một cái gì đó như thế này:

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

Cách bạn có nó bằng văn bản, bạn đang cố gắng để tham khảo quan điểm trước khi bạn đã cho họ một giá trị, vì thế mà NPE. Nếu food_item_display trên thực tế bố cục cha mẹ cho tất cả các mục này, bạn nên sử dụng Chế độ xem đó để tìm những người khác theo ID, như tôi đã hiển thị ở đây.

+0

Bạn đúng 100% .. cảm ơn vì điều đó. Đã được chỉ cần cắm và chugging và để cho ý tưởng làm công việc ... không chắc chắn lý do tại sao được sử dụng các đối tượng của tôi để tìm xem ... lạ. Tuy nhiên, nó không khắc phục được sự cố .. vẫn gặp sự cố. Tôi sẽ đặt toàn bộ văn bản của adb của tôi đăng nhập vào bình luận ở trên, nơi các chàng trai khác yêu cầu cho nó. –

2

Bạn phải sử dụng onActivityCreated hoặc onCreateView để nhận các tham chiếu như ví dụ sau. Bạn không thể sử dụng onCreate để làm như vậy, vì đoạn sẽ chỉ được tạo sau 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); 

} 

Một ví dụ khác:

@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

Có sự khác biệt lớn nào giữa việc thực hiện điều này trong onCreateView() hoặc onActivityCreated() không? – AdamMc331

+0

Một chút. Hãy xem http://stackoverflow.com/questions/28929637/difference-and-uses-of-oncreate-oncreateview-and-onactivitycreated-in-fra –

+0

Có cùng lỗi -> ddms: null java.lang.NullPointerException \t tại com.android.ddmlib.JdwpPacket.writeAndConsume (JdwpPacket.java:213) \t tại com.android.ddmlib.Client.sendAndConsume (Client.java:675) \t tại com.android.ddmlib.HandleHello.sendHELO (HandleHello.java:195) \t tại com.android.ddmlib.HandleHello.sendHelloCommands (HandleHello.java:66) \t tại com.android.ddmlib.Client.getJdwpPacket (Client.java:772) \t tại com. android.ddmlib.MonitorThread.processClientActivit y (MonitorThread.java:317) \t tại com.android.ddmlib.MonitorThread.run (MonitorThread.java:263) –

Các vấn đề liên quan