[英]Getting errors in showing alert dialog from another activity(to prevent the activity from destroyed)
不知道為什么,沒有人試圖解決這個問題。
在這里,我完全搞砸了。 我正在創建一個Android應用,目前在3個活動的操作中遇到問題。
我有Activity1 , Activity2和Activity3 。
Activity1 :在AsyncTask(background)
獲取數據並顯示listView。 顯示alertDialog用onClick
上ListView項行動。
我在AsyncTask
使用構造函數
public NameAsyncTask(Context cxt) {
context = cxt;
pDialog = new ProgressDialog(context);
adapter = new SimpleAdapter(
context, dataList,
R.layout.list_incident, new String[]{"refName", "sub", "status", "categ", "createTime", "organisation"},
new int[]{R.id.in_name, R.id.sub, R.id.status,R.id.categ_show, R.id.created_time_show, R.id.cust_name});
binder = new SimpleAdapter.ViewBinder() {
@Override
public boolean setViewValue(View view, Object data, String textRepresentation) {
if (view.equals((TextView)view.findViewById(R.id.status))) {
statusText = (TextView)view.findViewById(R.id.status);
if (data.equals("Unresolved"))
statusText.setTextColor(context.getResources().getColor(R.color.red));
else if (data.equals("In Progress"))
statusText.setTextColor(context.getResources().getColor(R.color.yellow));
}
return false;
}
};
}
我將AsyncTask
類稱為new NameAsyncTask(Activity1.this).execute();
Activity2 :顯示被單擊時listView項的詳細信息。 最后在Activity3
調用finish()
。
Activity3 :更新項目的詳細信息,並將1st activity
AsyncTask(background)
作為new NameAsyncTask(Activity3.this).execute();
因此該項目將在first activity
刪除,並且listView將更新。 調用finish()
,它將直接轉到第一個活動(因為第二個活動已經完成)。
現在的問題是,如果我再次單擊listView項目,它將引發錯誤
java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.pm.ApplicationInfo android.content.Context.getApplicationInfo()' on a null object reference
at android.content.ContextWrapper.getApplicationInfo(ContextWrapper.java:149)
at android.view.ContextThemeWrapper.getTheme(ContextThemeWrapper.java:157)
at android.support.v7.app.AlertDialog.resolveDialogTheme(AlertDialog.java:113)
at android.support.v7.app.AlertDialog$Builder.<init>(AlertDialog.java:291)
at com.lavazza.IncidentServiceActivity$GetPendingIncidents$2.onItemClick(IncidentServiceActivity.java:267)
at android.widget.AdapterView.performItemClick(AdapterView.java:310)
at android.widget.AbsListView.performItemClick(AbsListView.java:1156)
at android.widget.AbsListView$PerformClick.run(AbsListView.java:3121)
at android.widget.AbsListView.onTouchUp(AbsListView.java:4048)
at android.widget.AbsListView.onTouchEvent(AbsListView.java:3807)
at android.view.View.dispatchTouchEvent(View.java:10023)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2626)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2307)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2632)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2321)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2632)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2321)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2632)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2321)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2632)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2321)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2632)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2321)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2632)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2321)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2632)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2321)
at com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:413)
at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1808)
在這條線上
final AlertDialog.Builder alertDialog = new AlertDialog.Builder(Activity1.this);
不確定Activity1
是否也遭到了破壞。
因為listView和binder
adapter
適用於活動的兩個上下文。 但是在alertDialog
它不起作用。 當我聲明final AlertDialog.Builder alertDialog = new AlertDialog.Builder(context);
在構造函數中。 它在Activity1中工作正常。
如果我使用Activity1Obj.new GetPendingIncidents(Activity3.this).execute();
從Activity3執行AsyncTask
Activity1Obj.new GetPendingIncidents(Activity3.this).execute();
它會引發錯誤
android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@1a8ec93 is not valid; is your activity running?
at android.view.ViewRootImpl.setView(ViewRootImpl.java:679)
at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:342)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:93)
at android.app.Dialog.show(Dialog.java:322)
at com.lavazza.IncidentServiceActivity$GetPendingIncidents$2.onItemClick(IncidentServiceActivity.java:338)
在這里, Activity1自動銷毀,我相信。 如果我錯了糾正我。
我已經試過了
->將alertDialog聲明中的context
更改為getParent
, getApplicationContext
和getBaseContext
。 沒事。
從Activity3
返回后,我必須顯示alertDialog
。
有沒有人可以幫助我。 我仍然在思考如何執行此操作。
您可以使用MyApplication.getContext()
代替context(例如Activity1.this
)。
AndroidManifest.xml
<application
android:name=".MyApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
MyApplication.java
public class MyApplication extends Application {
private static Context context;
@Override
public void onCreate() {
super.onCreate();
context = getApplicationContext();
}
public static Context getContext() {
return context;
}
}
MainActivity.java
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String app_name = MyApplication.getContext().getResources().getString(R.string.app_name);
Log.d("App name", app_name);
}
}
您只需完成顯示alertdialog的activity3即可,而無需同時完成activity1和2。
並使用context.finish();
其中context = your_activity.this;
希望對您有幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.