2013-03-30 31 views
0

我目前正在做一个页面,从PHP服务器检索数据,现在试图检索和绘图通过使用setImageResource图像,但不工作,我不知道它有什么问题,是有可能我只是将图像名称保存在数据库中,然后使用图像名称检索图像? 那旁边,我试图为量做一个简单的加减按钮,但应用程序强制停止一次,我按一下按钮..从drawable和字符串检索图像转换为Int问题

public class FoodDetailActivity extends Activity 
{ 
TextView FoodName; 
TextView FoodDesc; 
TextView FoodPrice; 
ImageView FoodImg; 
EditText Number; 
Button plus; 
Button minus; 
Button Addcart; 

String fid; 
int number; 

// Progress Dialog 
private ProgressDialog pDialog; 

// JSON parser class 
JSONParser jsonParser = new JSONParser(); 

// single product url 
private static final String url_food_details = "http://10.0.2.2/android_user/FoodDetail.php"; 

// JSON Node names 
private static final String TAG_SUCCESS = "success"; 
private static final String TAG_FOOD = "food"; 
private static final String TAG_FID = "fid"; 
private static final String TAG_FOODNAME = "food_name"; 
private static final String TAG_FOODPRICE = "food_price"; 
private static final String TAG_FOODDESCRIPTION = "food_description"; 
private static final String TAG_FOODURL = "food_url"; 

@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_food_detail); 


    // button 
    plus = (Button)findViewById(R.id.btn_plus); 
    plus.setOnClickListener(increase); 
    minus = (Button)findViewById(R.id.btn_minus); 
    minus.setOnClickListener(decrease); 
    Addcart = (Button)findViewById(R.id.btn_submit); 
    Number = (EditText)findViewById(R.id.text_number); 

    // getting food details from intent 
    Intent i = getIntent(); 

    // getting food id (fid) from intent 
    fid = i.getStringExtra(TAG_FID); 

    // Getting complete product details in background thread 
    new GetFoodDetails().execute(); 
} 

// Increase number of quantity 
    private OnClickListener increase = new OnClickListener() 
    { 
     public void onClick(View v) 
     { 
      String quantity = Number.getText().toString().trim(); 
      number = Integer.parseInt(quantity); 
      if(number > 0 && number < 99) 
      { 
       number = number + 1; 
       Number.setText(Integer.toString(number)); 
      } 
      else if(number == 99) 
      { 
       number = 1; 
       Number.setText(Integer.toString(number)); 
      } 
     } 
    }; 
// Decrease number of quantity 
    private OnClickListener decrease = new OnClickListener() 
    { 
     public void onClick(View v) 
     { 
      String quantity = Number.getText().toString(); 
      number = Integer.valueOf(quantity); 
      if(number > 1 && number <= 99) 
      { 
       number = number - 1; 
       Number.setText(Integer.toString(number)); 
      } 
      else if(number == 1) 
      { 
       number = 99; 
       Number.setText(Integer.toString(number)); 
      } 
     } 
    }; 

class GetFoodDetails extends AsyncTask<String, String, String> 
{ 
    /** 
    * Before starting background thread Show Progress Dialog 
    * */ 
    @Override 
    protected void onPreExecute() 
    { 
     super.onPreExecute(); 
     pDialog = new ProgressDialog(FoodDetailActivity.this); 
     pDialog.setMessage("Loading food details. Please wait..."); 
     pDialog.setIndeterminate(false); 
     pDialog.setCancelable(true); 
     pDialog.show(); 
    } 

    /** 
    * Getting product details in background thread 
    * */ 
    protected String doInBackground(String... params) 
    { 

     // updating UI from Background Thread 
     runOnUiThread(new Runnable() 
     { 
      public void run() 
      { 
       // Check for success tag 
       int success; 
       try { 
        // Building Parameters 
        List<NameValuePair> params = new ArrayList<NameValuePair>(); 
        params.add(new BasicNameValuePair("fid", fid)); 

        // getting product details by making HTTP request 
        // Note that product details url will use GET request 
        JSONObject json = JSONParser.makeHttpRequest(url_food_details, "GET", params); 

        // check your log for json response 
        Log.d("Single Food Details", json.toString()); 

        // json success tag 
        success = json.getInt(TAG_SUCCESS); 

        if (success == 1) 
        { 
         // successfully received food details 
         JSONArray foodObj = json.getJSONArray(TAG_FOOD); // JSON Array 

         // get first product object from JSON Array 
         JSONObject food = foodObj.getJSONObject(0); 

         // Loader image - will be shown before loading image 
         int loader = R.drawable.loader; 

         String image_url = food.getString(TAG_FOODURL); 

         // product with this fid found 
         // Edit Text 
         FoodName = (TextView)findViewById(R.id.food_name); 
         FoodPrice = (TextView)findViewById(R.id.food_price); 
         FoodDesc = (TextView)findViewById(R.id.food_desc); 
         FoodImg = (ImageView)findViewById(R.id.img_food); 

         // display product data in EditText 
         FoodName.setText(food.getString(TAG_FOODNAME)); 
         FoodPrice.setText("RM" + food.getString(TAG_FOODPRICE)); 
         FoodDesc.setText(food.getString(TAG_FOODDESCRIPTION)); 

         // ImageLoader class instance 
         ImageLoader imgLoader = new ImageLoader(getApplicationContext()); 

         // display image 
         imgLoader.DisplayImage(image_url, loader, FoodImg); 

        } 
        else 
        { 
         // no food detail found 
         // Launch error message 
         AlertDialog.Builder ad = new AlertDialog.Builder(FoodDetailActivity.this); 
         ad.setTitle("Error"); 
         ad.setMessage("Food Detail is empty!"); 
         ad.setPositiveButton("OK", new DialogInterface.OnClickListener() 
         { 
          public void onClick(DialogInterface dialoginterface, int i) 
          { 

          } 
         }); 
         ad.show(); 
        } 
       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 

     return null; 
    } 

    protected void onPostExecute(String file_url) 
    { 
     // dismiss the dialog once got all details 
     pDialog.dismiss(); 
    } 
} 

}

问题已经得到了解决,我使用ImageLoader的在服务器端通过url存储在数据库中检索图像。

回答

2

在这里:

Drawable d = getResources().getDrawable(R.drawable.mcchicken); //<<<< 

你想之前onCreate呼叫使用活动的背景。移动内部活动的方法onCreate初始化Drawable dsetContentView后:

Drawable d; //<<< declare d here 
@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_food_detail); 
    d = getResources().getDrawable(R.drawable.mcchicken); //<< initialize d here 
    .... 
} 

编辑::内doInBackground方法您试图访问UI元素。而不是使用runOnUiThread从doInBackground更新UI。您将需要在doInBackground执行完成后调用所有在UI线程上调用UI相关代码onPostExecute

+0

谢谢,我将尝试它.. 我可以问什么是关于 number = Integer.valueOf(数量)的问题; 我曾尝试过valueOf和parseInt,但是一旦我按下加号按钮,两者都会出错。 –

+0

@LiangNeo:也许可能只是在换行数字之前换第一个修剪字符串wrap = number = Integer。valueOf(quantity);'在try/catch块中捕获'NumberFormatException' –

+0

我发现这个问题,它只需要让数字变成字符串,然后它就起作用。我使用Number.setText(Integer.toString(number)); thx为您的帮助! –

1

在你的代码中很麻烦的材料。从一开始就很好。首先是唯一的问题。

为什么你把doInBackground()方法runOnUiThread()?如果你想更新你的UI来自任务在后台运行的一些信息,为此你有onProgressUpdate()或方法,这是与UI线程同步并允许其更新。 doInBackground()方法直接指定用于后台处理,并且不应该破坏它。

,这一行:

if (food.getString(TAG_FOODNAME) == "McChicken") 

将始终返回false,因为你是比较引用,而不是值。总是你比较字符串,你必须使用equals()方法。

而最后一件事情是这样的:

Drawable d = getResources().getDrawable(R.drawable.mcchicken); 

你不能调用之前setContentView()被调用。原因是,setContentView()主要目的是,它创建UI元素和资源的所有实例,如果你的东西,需要的资源这种方法之前调用,总是你会指点我的一些问题得到NPE

+0

在我这样做之前,我已经查看了[link](http://www.androidhive.info/2012/05/how-to-connect-android-with-php-mysql/) 的一个教程,我只是刚接触到android在半个月内,所以试图学习它..是否有任何建议学习材料? –