2013-10-25 41 views
1

我正在開發一個包含多個選項卡的小應用程序,其中每個選項卡只包含一種產品(例如比薩產品),並且可以從此選項卡添加特定產品(Margherita)訂單。每個選項卡都包含佈局,其中左側的按鈕代表每個產品,當前添加到訂單+右側的計算價格的項目(所有產品)列表。這是我的方式目前如何添加TabTabHost如何在創建新選項卡時傳遞額外信息

Bundle extras = new Bundle(); 
extras.putString("productType", "pizza"); 
tabHost.addTab(tabHost.newTabSpec("pizza").setIndicator("Pizza"), OrderFragment.class, extras); 

的問題是,當我試圖讓論點OrderFragment的構造,它拋出一個異常:

E/AndroidRuntime(533): FATAL EXCEPTION: main 
E/AndroidRuntime(533): java.lang.NullPointerException 

之所以我需要將一些數據傳遞給OrderFragment,OrderFragment正在成爲任何類型產品(產品,麪食等)的抽象類,因此它可以找出它的產品類型並加載適當的數據爲了那個原因。我認爲addTab(TabSpec, Class<T>, Bundle)這個方法創建了一個指定類的實例,並在其中添加了額外的內容,但似乎這些額外內容沒有與它一起打包。 (猜猜這是爲了另一個目的)。我將不勝感激任何建議如何解決這個問題。如果你想以完全不同的方式做到這一點,我也希望指出它。

OrderFragment:

public class OrderFragment extends Fragment implements IEditOrder{ 

    private static final String TAG = "OrderFragment"; 

    private Controller controller; 

    private ListView lst_order; 
    private TextView txt_order_total; 

    private Button btn_finishOrder; 
    private Button btn_cancelOrder; 

    private String productType; 

    private OrderAdapter orderAdapter; 

    private static final int DIALOG_EDIT_ORDER = 1; 



    public OrderFragment() { 
     Bundle extras = getArguments(); 
     Log.d(TAG, "Extras: " + extras.toString()); 
     this.productType = extras.getString("productType"); 
    } 


    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 

     //setRetainInstance(true); 

     controller = Controller.getInstance(); 
     controller.loadProducts(getActivity().getApplicationContext()); 
     //FillDatabase.loadDataToDatabase(getActivity()); 
    } 

    @Override 
    public void onSaveInstanceState(Bundle outState) { 
     // TODO Auto-generated method stub 
     super.onSaveInstanceState(outState); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

     View view = inflater.inflate(R.layout.fragment_pizza, container, false); 

     txt_order_total = (TextView)view.findViewById(R.id.txt_order_total); 

     btn_finishOrder = (Button)view.findViewById(R.id.btn_finishOrder); 
     btn_cancelOrder = (Button)view.findViewById(R.id.btn_cancelOrder); 

     btn_finishOrder.setOnClickListener(finishOrder); 
     btn_cancelOrder.setOnClickListener(cancelOrder); 

     final RelativeLayout layout = (RelativeLayout) view.findViewById(R.id.rl_order_pizza); 

     orderAdapter = new OrderAdapter(getActivity(), controller.getOrderMap()); 

     lst_order = (ListView) view.findViewById(R.id.lst_order); 
     lst_order.addHeaderView(inflater.inflate(R.layout.order_list_header, null)); 
     lst_order.setAdapter(orderAdapter); 

     lst_order.setOnItemClickListener(itemClickListener); 

     txt_order_total.setText("Total Price: " + controller.calculateTotalPrice()); 

     layout.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() 
     { 
      @Override 
      public void onGlobalLayout() 
      { 
       layout.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
       RelativeLayout.LayoutParams layoutParams; 

       int currentX = 20; 
       int currentY = 20; 

       for (Product product: controller.getProducts("pizza")){ 

        layoutParams = new RelativeLayout.LayoutParams(UIConstnts.BUTTON_WIDTH, UIConstnts.BUTTON_HEIGHT); 

        Button tempButton = new Button(getActivity().getApplicationContext()); 
        tempButton.setId((int)product.getId()); 
        tempButton.setText(product.getName()); 
        tempButton.setOnClickListener(clickListener); 

        layoutParams.setMargins(currentX, currentY, 0, 0); 
        tempButton.setLayoutParams(layoutParams); 

        layout.addView(tempButton); 

        if (layout.getWidth() < currentX + UIConstnts.MARGIN_LEFT + (2 * UIConstnts.BUTTON_WIDTH)){ 
         currentX = 20; 
         currentY += UIConstnts.BUTTON_HEIGHT + UIConstnts.MARGIN_BOTTOM; 
        } 
        else{ 
         currentX += UIConstnts.MARGIN_LEFT + UIConstnts.BUTTON_WIDTH; 
        } 
       } 
       layout.requestLayout(); 
      } 
     }); 
     return view; 
    } 

    private OnClickListener clickListener = new OnClickListener(){ 

     @Override 
     public void onClick(View view) { 
      controller.addOrderItem(1, (long)view.getId()); 
      updateQuantity(); 
      txt_order_total.setText("Total Price: " + controller.calculateTotalPrice()); 
     } 
    }; 

    private OnItemClickListener itemClickListener = new OnItemClickListener() { 

     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      showDialog(id, Integer.valueOf(((TextView)view.findViewById(R.id.txt_lst_quantity)).getText().toString())); 
     } 
    }; 

    private OnClickListener finishOrder = new OnClickListener(){ 

     @Override 
     public void onClick(View v) { 
      controller.finishOrder(getActivity()); 
      updateQuantity(); 
     } 
    }; 

    private OnClickListener cancelOrder = new OnClickListener(){ 

     @Override 
     public void onClick(View v) { 
      controller.resetOrder(); 
      updateQuantity(); 
     } 
    }; 

    private void showDialog(long productId, int quantity) { 
     DialogFragment newFragment = EditOrderDialog.newInstance(productId, quantity, "Change Quantity"); 
     newFragment.setTargetFragment(this, DIALOG_EDIT_ORDER); 
     newFragment.show(getFragmentManager(), "dialog"); 
    } 

    @Override 
    public void updateQuantity() { 
     orderAdapter.setOrderList(controller.getOrderMap()); 
     orderAdapter.notifyDataSetChanged(); 
     txt_order_total.setText("Total Price: " + controller.calculateTotalPrice()); 
    } 




} 

圖片UI的。 (右側ListView控件存在於所有選項都包含所有產品的順序): enter image description here

+0

每個選項卡是否包含產品列表,最後一個選項卡是否包含完整訂單?所以第一個標籤是第一步,第二個標籤是第二個步驟等。或者是您想要訂購的同一頁上的每個產品的訂單? – BigT

+0

我添加了UI的圖片。請看看 – Husky

+0

那第二個Pizza選項卡,可能是任何產品?即意大利麪 – BigT

回答

0

不要問在構造函數中的參數/演員!他們目前沒有設置。他們將在稍後提供。

//If you create your Fragments yourself, create them in a static factory method: 
public static Fragment newInstance(String productType){ 
    Bundle b = new Bundle(); 
    b.putString(ARG_PRODUCT_TYPE, productType); 
    Fragment f = new OrderFragment(); 
    f.setArguments(b); 
    return f; 
} 

//Write a helper method for your arguments 
public String getProductType(){ 
    if(getArguments().containsKey(ARG_PRODUCT_TYPE)){ 
     return getArguments().getString(ARG_PRODUCT_TYPE); 
    } 
    return null; 
} 

然後使用輔助方法後的構造,即,在的onCreate()。

相關問題