0

私のアプリには、Facebookに写真をアップロードするボタンがあります。このボタンを押すと、警告ボックスが表示されてユーザーのキャプションが表示され、写真がアップロードされます。写真が Facebook にアップロードされている間 (キャプションが与えられて押された後)、[戻る] ボタンを押すとOK、アクティビティが再び表示されますが、今回は写真を再度アップロードしようとすると、警告ボックスが表示されません (ただし、ボタンの場所をOK押すと画像がアップロードされるため、非表示モードになっています。

//Listener to button to upload to facebook
class ButtonListener3 implements View.OnClickListener{

        @Override
    public void onClick(View v) {

        Pic.this.Commentbox();

    }
}


public void Commentbox(){
    value="";
    alert1 = new AlertDialog.Builder(this);

    alert1.setTitle("Write caption");


    // Set an EditText view to get user input 
    final EditText input = new EditText(this);
    alert1.setView(input);

    alert1.setPositiveButton("OK", new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int whichButton) {
    value = input.getText().toString();
    Pic.this.fb();
     }
    });

    alert1.setNegativeButton("No, thanks", new DialogInterface.OnClickListener()      {
     public void onClick(DialogInterface dialog, int whichButton) {
       value="";
       Pic.this.fb();
    }
    });

     alert1.show();

}

    public void fb(){
final Facebook facebook=new Facebook(ID);
facebook.authorize(Pic.this, new String[] { "publish_stream" },
        new DialogListener() {

    @Override
    public void onFacebookError(FacebookError e) {
        // TODO Auto-generated method stub
    }

    @Override
    public void onError(DialogError dialogError) {
        // TODO Auto-generated method stub
    }

    @Override
    public void onComplete(Bundle values) {
        postToWall(values.getString(Facebook.TOKEN));                                              
    }

    private  void postToWall(String accessToken) {    


        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        bmp.compress(Bitmap.CompressFormat.PNG, 100, baos);
        byte[] data = baos.toByteArray();
        Bundle bundle = new Bundle();

        bundle.putString(Facebook.TOKEN, accessToken);
        bundle.putByteArray("facebookPictureData", data);
        // The byte array is the data of a picture.
        bundle.putByteArray("picture",     getIntent().getExtras().getByteArray("data"));
        bundle.putString("caption",value); 

        try {
            facebook.request("me/photos", bundle, "POST");
            Toast.makeText(getApplicationContext(),"Picture uploaded to your facebook account successfully",
                    Toast.LENGTH_SHORT).show();

        } catch (FileNotFoundException fileNotFoundException) {
            Toast.makeText(getApplicationContext(),"Picture upload failed, try again",
                    Toast.LENGTH_SHORT).show();
        } catch (MalformedURLException malformedURLException) {
            Toast.makeText(getApplicationContext(),"Picture upload failed, try again",
                    Toast.LENGTH_SHORT).show();
        } catch (IOException ioException) {
            Toast.makeText(getApplicationContext(),"Picture upload failed, try again",
                    Toast.LENGTH_SHORT).show();
        }
    }


    @Override
    public void onCancel() {
        // TODO Auto-generated method stub
    }
});

}
4

1 に答える 1

1

デバイスを回転させて、ウィンドウが表示されていない (表示されないままになる) か、再描画の問題がある (表示される) かを確認します。

再描画の問題は Android のバグではなく、アプリの設計上の問題です。メイン (UI) スレッドで何秒もかかるアクションを実行しないでください。操作中に再描画がブロックされるためです。

@azgolfer のコメントからのヒントを使用できます (アップロードを にリファクタリングしますAsyncTask)。のサブクラスを作成し、そのメソッドAsyncTaskで実行します。そのインスタンスをハンドラから作成します。完了したアップロードを通知し、タスクの進行状況を表示する を作成するために使用します。fbdoInBackgroundexecuteOnClickonPostExecuteProgressBar

OnClickそのままでは、 (期間に関して) ハンドラーのコードが多すぎます。

または、いつでも呼び出しinvalidateて、デバイスの回転などの同様の効果を実現できます。

ViewGroup everything = findViewById (R.id.mainLayout);
everything.invalidate();

しかし、それは推奨される設計ではなく、その方法を取ることにした場合、複数の面でフレームワークと戦うことになるでしょう。

于 2012-06-22T21:00:21.313 に答える