0

-- これは問題ではない可能性があります -- 修正して元に戻そうとした後、デバイスでこれを再現することはできません。

だから私は少し混乱していますが、ここにいくつかのコードがあります。コードを少し簡略化するために変更したため、タイプミスがある可能性がありますが、これは私が見ているものの「要点」です。ただし、基本的に一部のデバイスでは、例 1 ではダイアログが起動されませんが、オプション 2 ではすべてのデバイスでダイアログが起動されます。

  1. デバイス/Android バージョンの違いはなぜですか?
  2. 文脈は同じではないでしょうか?アプリケーションコンテキストとビューコンテキストが異なることは知っています。しかし、なぜこれが機能するのかわかりません。ビューに使用すべきではないことはわかってgetApplicationContext()います..しかし、まだ少し混乱しています。

(MyTestActivity は MyActivity のサブクラスであることに注意してください)

編集: オプション #1 では、MyActivity はクラス変数から Context を取得し、それを使用してダイアログを起動します。オプション #2 では、MyTestActivity がコンテキストを取得し (MyActivity と同じコンテキストである必要がありますか?)、それを showMessage に渡します。(showMessage は、例 #2 の新しいパラメーターを取ります)

例 #1

///////////////////////////////////////////
// THIS Example works on Galaxy Nexus, but not on some other devices, such as : 
// SAMSUNG-SGH-I997. (infuse) - this just simply does not display anything.

public class MyTestActivity extends MyActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.my_layout);
        Intent i = new Intent(MyTestActivity.this, ActivityTwo.class);
        startActivityForResult(i, Constants.FROM_ACTIVITY);
    }

    @Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) {     
        super.onActivityResult(requestCode, resultCode, data); 
        IntentResult intentResult = IntentIntegrator.parseActivityResult(requestCode, 
                   resultCode, data);
        if ((intentResult != null) && (resultCode == RESULT_OK)) {
             playsound(SOUND_DING); // User hears this - SoundPool
             showMessage("Test Title","Test Message"); // User does not see message
        }
    }
}

public class MyActivity extends Activity {
    private Context mContext;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mContext=this;
    }

    public void showMessage(String title, String message) {
        AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
    builder.setTitle(title);
    builder.setMessage(message)
               .setPositiveButton(mContext.getString(R.string.ok), 
                new DialogInterface.OnClickListener() {
                   public void onClick(DialogInterface dialog, int id) {

                            finish();

                   }
               });
    AlertDialog alert = builder.create();
    alert.show();
    }
}

そして例#2

/////////////////////////////////////////////////////////////
// This works on all devices
    public class MyTestActivity extends MyActivity {
        private Context context;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.my_layout);
            context = this;
        Intent i = new Intent(MyTestActivity.this, ActivityTwo.class);
        startActivityForResult(i, Constants.FROM_ACTIVITY);
        }

        @Override 
        public void onActivityResult(int requestCode, int resultCode, Intent data) {     
            super.onActivityResult(requestCode, resultCode, data); 
            IntentResult intentResult = IntentIntegrator.parseActivityResult(requestCode, 
                       resultCode, data);
            if ((intentResult != null) && (resultCode == RESULT_OK)) {
                 playsound(SOUND_DING); // user hears this
                 showMessage("Test Title","Test Message", context); // user sees this
            }
        }
    }

    public class MyActivity extends Activity {
        private Context mContext;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            mContext=this;
        }

        public void showMessage(String title, String message, Context context) {
            AlertDialog.Builder builder = new AlertDialog.Builder(context);
        builder.setTitle(title);
        builder.setMessage(message)
                   .setPositiveButton(context.getString(R.string.ok), 
                    new DialogInterface.OnClickListener() {
                       public void onClick(DialogInterface dialog, int id) {

                                finish();

                       }
                   });
        AlertDialog alert = builder.create();
        alert.show();
        }
    }
4

1 に答える 1

1

答えは簡単です。super.onCreate(savedInstanceState);オーバーライドを呼び出さないと、onCreate()代わりにガベージが返されますcontext。を呼び出すとsuper.onCreate(savedInstanceState);、動作中の が得られますcontext

于 2012-05-12T16:07:41.367 に答える