2

古いデバイスでは、標準の共有インテント (fb、twitter、電子メールなど) を実行すると、実際の共有ダイアログがポップアップするまでに数秒の遅延があることに気付きました。この共有ダイアログが表示されるのを待っている間に、進行状況ダイアログをポップアップ表示するにはどうすればよいでしょうか?

これが私のコードです:

 private void share(String subject,String body) {
        Intent share = new Intent(Intent.ACTION_SEND);
        share.setType("text/plain");
        share.putExtra(android.content.Intent.EXTRA_SUBJECT, title);
        share.putExtra(android.content.Intent.EXTRA_TEXT, body);
        startActivity(Intent.createChooser(share, "Share via"));
    }
4

6 に答える 6

5

私はそれを行う方法を考え出しました。startActivity(shareIntent) を呼び出すと、メソッドの onPause が呼び出されます。これを解決するために、次のことを行いました。

  • クラス進行状況ダイアログ変数を作成します。
  • 共有機能の開始時に進行状況ダイアログを表示します。
  • onPause で、次のことを行いました。

if(dialog.isShowing()){
  dialog.dismiss();
}
于 2012-09-27T01:53:58.527 に答える
1

これは不可能のようです。インテントチューザーをいつ表示する準備ができているかを知る方法はありません。アプリに関する限り、これは非同期操作のようです。

これを確認するために、関数のタイミングを試すことができます。

private void share(String subject,String body) {
    //Timing code
    long startTime = System.currentTimeMillis();

    Intent share = new Intent(Intent.ACTION_SEND);
    share.setType("text/plain");
    share.putExtra(android.content.Intent.EXTRA_SUBJECT, title);
    share.putExtra(android.content.Intent.EXTRA_TEXT, body);
    startActivity(Intent.createChooser(share, "Share via"));

    //Timing code
    long endTime = System.currentTimeMillis();
    Log.d("Test", "Time for share function: " + (endTime-startTime) + "ms");
}

結果が非常に小さい場合は、関数がすばやく実行されており、ボトルネックがAndroidシステム自体にあることを意味します(影響を受けることはありません)。

一方、500ミリ秒以上のオーダーが発生する場合は、XepterXで説明されている方法を使用して、進行状況ダイアログを表示する価値があります。

于 2012-09-27T01:45:22.903 に答える
1

以下の方法をお勧めします。

  1. 最初に進行状況ダイアログを作成して表示します
  2. 通話共有アクティビティ
  3. メイン アクティビティに戻る進行状況ダイアログを非表示にする (onResume)

コードは次のとおりです。

ProgressDialog shareWaitDialog;

private void shareIt() {
    String subject="Subject";
    String text  = "text....";
    shareWaitDialog = new ProgressDialog(getActivity());
    shareWaitDialog.setTitle("Sharing...");
    shareWaitDialog.setMessage(subject);
    shareWaitDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
    shareWaitDialog.show();

    Intent sharingIntent = new Intent(android.content.Intent.ACTION_SEND);
    sharingIntent.setType("text/plain");
    sharingIntent.putExtra(android.content.Intent.EXTRA_SUBJECT,
            subject);
    sharingIntent.putExtra(android.content.Intent.EXTRA_TEXT,
            text));
    startActivity(Intent.createChooser(sharingIntent,
            "Share using:"));
}

@Override
public void onResume() {
    if (shareWaitDialog != null && shareWaitDialog.isShowing())
        shareWaitDialog.hide();

    super.onResume();
}
于 2014-10-07T06:20:33.480 に答える
0

ダイアログを表示するのは非常に難しいようですが、代わりに、共有ボタンのクリックで「アプリを待っています...」のようなトーストを表示できます。トーストは時間のギャップを埋めることができます。

mShare.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {


            Toast.makeText(ReferralActivity.this, "Waiting for Apps to Send", Toast.LENGTH_SHORT).show();

            try {
                String sAux = "Content To Share";
                Intent i = new Intent(Intent.ACTION_SEND);
                i.setType("text/plain");
                i.putExtra(Intent.EXTRA_SUBJECT, "Sample");
                i.putExtra(Intent.EXTRA_TEXT,sAux);
                startActivity(Intent.createChooser(i, "Share using:"));
            } catch(Exception e) {
                //e.toString();
            }
        }
    });
于 2017-08-23T21:42:43.820 に答える
-1

たとえば、AsyncTask()を使用して、ダイアログの進行状況を表示できます。

 private class TestTask extends AsyncTask<Void, Void, Void> {

    protected void onPreExecute() { 
        //show dialog 
    }

    protected void doInBackground(Object... params) { 
        private void share(subject,body); 
    }

    protected void onPostExecute(Long result) {
        //cancel dialog
    }
}

によってタスクを開始します

new TestTask().execute();

AsyncTask()に関する詳細については、こちらのドキュメントをご覧ください

于 2012-09-27T01:41:47.097 に答える