Android 语境不是语境?(不启动对话框)
--这可能不是问题——在修复并尝试恢复后,我现在无法通过设备复制此内容 所以我有点困惑,但这里有一些代码。我修改了代码以简化它,所以我可能有一个打字错误,但这是我看到的“要点”。但基本上在某些设备上示例1不会启动对话框,而选项2会在所有设备上启动对话框:Android 语境不是语境?(不启动对话框),android,android-activity,android-context,Android,Android Activity,Android Context,--这可能不是问题——在修复并尝试恢复后,我现在无法通过设备复制此内容 所以我有点困惑,但这里有一些代码。我修改了代码以简化它,所以我可能有一个打字错误,但这是我看到的“要点”。但基本上在某些设备上示例1不会启动对话框,而选项2会在所有设备上启动对话框: 为什么设备/安卓版本之间存在差异 上下文是否应该不一样?我知道应用程序上下文和视图上下文是不同的。但不确定为什么这会起作用。我知道我不应该在视图中使用getApplicationContext()。。但还是有点困惑 (请注意MyTestActi
getApplicationContext()
。。但还是有点困惑李>
(请注意MyTestActivity是MyActivity的一个子类) 编辑:在选项#1中,MyActivity从类变量获取上下文,并使用该上下文启动对话框。 在选项2中,MyTestActivity获取上下文(应该与MyActivity相同吗?)并将其传递到showMessage中。(showMessage采用示例2中的新参数) 示例#1 例如#2
答案很简单。如果不调用
super.onCreate(savedInstanceState)
在重写的onCreate()
中,您得到的是一个垃圾,而不是context
。如果调用super.onCreate(savedInstanceState)
,您会得到一个工作的上下文
在MyTestActivity
上没有showMessage()
,所以我不确定为什么会编译它。有一个输入错误。。应该是MyActivty扩展活动。MyTestActivity扩展了MyActivity。MyTestActivity是MyActivity的一个子类。要重新写入。。这适用于大多数设备,但要使其适用于所有设备,我必须使用选项2..Oops,在复制/粘贴/编辑时将其删除。尽管无法重现问题,但已编辑的问题给您评分。
///////////////////////////////////////////
// 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();
}
}
/////////////////////////////////////////////////////////////
// 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();
}
}