0

私は現在、phpサーバーからデータを取得するページを作成しており、setImageResourceを使用してドローアブルから画像を取得しようとしていますが、機能していません。何が問題なのかわかりません。画像名をデータベースに保存してから取得することは可能ですかイメージ名を使用してイメージ? それに加えて、数量の単純なプラスマイナスボタンを実行しようとしましたが、ボタンをクリックするとアプリが強制停止します..

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ストアを使用してサーバー側で画像を取得しました。

4

2 に答える 2

2

ここに:

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

onCreate呼び出しの前に Activity のコンテキストを使用しようとしています。次のように、Activity のメソッドDrawable d内で初期化を移動します。onCreatesetContentView

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 要素にアクセスしようとしているメソッド内。を使用して doInBackground から UI を更新する代わりにrunOnUiThreadonPostExecutedoInBackground の実行が完了した後、Ui スレッドで呼び出すすべての UI 関連コードを移動する必要があります。

于 2013-03-30T13:33:14.300 に答える
1

あなたのコードには非常に厄介な素材があります。最初からとても素敵です。最初は質問だけです。

doInBackground()メソッドrunOnUiThread( )の中に入れているのはなぜですか? UIバックグラウンドで実行されているタスクからの情報で更新したい場合は、UI Thread と同期して更新を許可するonProgressUpdate()またはメソッドがあります。doInBackground()メソッドはバックグラウンド処理に直接指定されており、壊してはいけません。onPostExecute()

次に、この行:

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

値ではなく参照を比較しているため、常に false を返します。常に文字列を比較しているためequals()、トリックを行うメソッドを使用する必要があります。

そして最後はこれです:

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

が呼び出される前にそれを呼び出すことはできませんsetContentView()。理由は、主な目的はsetContentView()、UI 要素とリソースのすべてのインスタンスを作成することであり、このメソッドの前にリソースを必要とする何かを呼び出す場合、常に取得することです。NPE

于 2013-03-30T13:38:49.387 に答える