簡體   English   中英

在顯示來自另一個活動的警報對話框時出現錯誤(以防止該活動被破壞)

[英]Getting errors in showing alert dialog from another activity(to prevent the activity from destroyed)

不知道為什么,沒有人試圖解決這個問題。

在這里,我完全搞砸了。 我正在創建一個Android應用,目前在3個活動的操作中遇到問題。

我有Activity1Activity2Activity3

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更改為getParentgetApplicationContextgetBaseContext 沒事。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM