0

誰もこの問題を解決しようとしている理由はわかりません。他のアクティビティから警告ダイアログを表示する際にエラーが発生する(アクティビティが破壊されないように)

ここで私は完全に台無しです。私はアンドロイドアプリを作成していますが、現在3つのアクティビティの操作に問題があります。

私はActivity1Activity2Activity3を持っています。

アクティビティ1AsyncTask(background)のデータを取得し、listViewを表示します。リストビューアイテムにonClickアクションのalertDialogを表示しています。

私はActivity2new NameAsyncTask(Activity1.this).execute();

としてAsyncTaskクラスを呼んでいる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; 
       } 
      }; 
     } 

でコンストラクタを使用しています。それをクリックすると、リストビューの項目の詳細を示します。最後にfinish()Activity3に入れるように呼び出します。

Activity3:アイテムの詳細を更新し1st activityので、その項目をfirst activityに削除され、リストビューが更新されますnew NameAsyncTask(Activity3.this).execute();としてのAsyncTask(background)を呼び出します。 finish()と呼びます(2回目のアクティビティは既に終了しているため)。再び私はListView項目をクリックした場合

さて問題は、ある、それはまた、distroyedなっているActivity1かどうか、

final AlertDialog.Builder alertDialog = new AlertDialog.Builder(Activity1.this); 

わからないこの行に

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) 

としてエラーがスローされます。

リストビューの場合はadapter、アクティビティの両方のコンテキストの場合はbinderが動作します。しかしalertDialogでは動作しません。私がfinal AlertDialog.Builder alertDialog = new AlertDialog.Builder(context);をコンストラクタに宣言したとき。 アクティビティ1で正常に動作します。

私はAsyncTaskActivity1Obj.new GetPendingIncidents(Activity3.this).execute();とActivity3から、それはここで私は信じて自動的に破棄されActivity1

android.view.WindowManager$BadTokenException: Unable to add window -- token [email protected] 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) 

としてエラーがスロー実行した場合。私が間違っているなら私を訂正してください。

Iはすでに

を試み - >getParentgetApplicationContextgetBaseContextとしてalertDialogの宣言でcontextを変更します。何も働かなかった。

返信後にalertDialogと表示されました。Activity3です。

私を助ける人はいますか?それでも私はこれを実行する方法を考えています。

答えて

0

コンテキスト(Activity1.this)の代わりにMyApplication.getContext()を使用できます。

の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);  
    } 
} 
+0

ここで 'MyApplication'は' app name'を参照していますか? – Shambhu

+0

私のために働かなかった。 – Shambhu

+0

'MyApplication'はメインアクティビティと似ています。マニフェストで記述し、 'Application'を拡張するクラスを作成する必要があります。 – dralexnumber

0

ますあなただけのアクティビティ3を完了する必要があります。alertdialogを表示しており、アクティビティ1とアクティビティ2を終了する必要はありません。2

また、 context.finish();を使用してください。
ここでcontext = your_activity.this;

ご希望の場合はお手数ですが、

+0

alertdialogは' Activity1'にあります。 'Activity3'で' Activity1.AsyncTask'を呼び出した後、第3アクティビティは終了します。次に、「Activity2」はすでに終了していますが、直接「Activity1」になります。そして、 'Activity1'で' listView'の別の項目をクリックすると、 'あなたの活動は実行中ですか? 'というエラーが表示されます。ここで私の現在の活動は1番目です。 – Shambhu

関連する問題