2013-09-26 8 views
20

Hy. Ho cercato di creare una finestra di avviso, ma quando faccio funzionare la mia domanda, è un'eccezioneErrore Android: impossibile aggiungere finestra - il token null non è per un'applicazione

09-26 12:43:21.949: E/AndroidRuntime(14618): FATAL EXCEPTION: main 
09-26 12:43:21.949: E/AndroidRuntime(14618): android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application 
09-26 12:43:21.949: E/AndroidRuntime(14618): at android.view.ViewRootImpl.setView(ViewRootImpl.java:687) 
09-26 12:43:21.949: E/AndroidRuntime(14618): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:301) 
09-26 12:43:21.949: E/AndroidRuntime(14618): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:215) 
09-26 12:43:21.949: E/AndroidRuntime(14618): at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:140) 
09-26 12:43:21.949: E/AndroidRuntime(14618): at android.app.Dialog.show(Dialog.java:278) 
09-26 12:43:21.949: E/AndroidRuntime(14618): at com.example.stampp.UI.Rewards.DeleteRewardsFragment$1.onItemClick(DeleteRewardsFragment.java:80) 
09-26 12:43:21.949: E/AndroidRuntime(14618): at android.widget.AdapterView.performItemClick(AdapterView.java:292) 
09-26 12:43:21.949: E/AndroidRuntime(14618): at android.widget.AbsListView.performItemClick(AbsListView.java:1394) 
09-26 12:43:21.949: E/AndroidRuntime(14618): at android.widget.AbsListView$PerformClick.run(AbsListView.java:3024) 
09-26 12:43:21.949: E/AndroidRuntime(14618): at android.widget.AbsListView.onTouchEvent(AbsListView.java:3846) 
09-26 12:43:21.949: E/AndroidRuntime(14618): at android.view.View.dispatchTouchEvent(View.java:5629) 
09-26 12:43:21.949: E/AndroidRuntime(14618): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1964) 
09-26 12:43:21.949: E/AndroidRuntime(14618): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1725) 
09-26 12:43:21.949: E/AndroidRuntime(14618): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1970) 
09-26 12:43:21.949: E/AndroidRuntime(14618): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1739) 
09-26 12:43:21.949: E/AndroidRuntime(14618): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1970) 
09-26 12:43:21.949: E/AndroidRuntime(14618): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1739) 
09-26 12:43:21.949: E/AndroidRuntime(14618): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1970) 
09-26 12:43:21.949: E/AndroidRuntime(14618): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1739) 
09-26 12:43:21.949: E/AndroidRuntime(14618): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1970) 
09-26 12:43:21.949: E/AndroidRuntime(14618): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1739) 
09-26 12:43:21.949: E/AndroidRuntime(14618): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1970) 
09-26 12:43:21.949: E/AndroidRuntime(14618): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1739) 
09-26 12:43:21.949: E/AndroidRuntime(14618): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1970) 
09-26 12:43:21.949: E/AndroidRuntime(14618): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1739) 
09-26 12:43:21.949: E/AndroidRuntime(14618): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1970) 
09-26 12:43:21.949: E/AndroidRuntime(14618): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1739) 
09-26 12:43:21.949: E/AndroidRuntime(14618): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2062) 
09-26 12:43:21.949: E/AndroidRuntime(14618): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1400) 
09-26 12:43:21.949: E/AndroidRuntime(14618): at android.app.Activity.dispatchTouchEvent(Activity.java:2369) 
09-26 12:43:21.949: E/AndroidRuntime(14618): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2010) 
09-26 12:43:21.949: E/AndroidRuntime(14618): at android.view.View.dispatchPointerEvent(View.java:5809) 
09-26 12:43:21.949: E/AndroidRuntime(14618): at android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:3130) 
09-26 12:43:21.949: E/AndroidRuntime(14618): at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2658) 
09-26 12:43:21.949: E/AndroidRuntime(14618): at android.view.ViewRootImpl.processInputEvents(ViewRootImpl.java:1015) 
09-26 12:43:21.949: E/AndroidRuntime(14618): at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2667) 
09-26 12:43:21.949: E/AndroidRuntime(14618): at android.os.Handler.dispatchMessage(Handler.java:99) 
09-26 12:43:21.949: E/AndroidRuntime(14618): at android.os.Looper.loop(Looper.java:137) 
09-26 12:43:21.949: E/AndroidRuntime(14618): at android.app.ActivityThread.main(ActivityThread.java:4517) 
09-26 12:43:21.949: E/AndroidRuntime(14618): at java.lang.reflect.Method.invokeNative(Native Method) 
09-26 12:43:21.949: E/AndroidRuntime(14618): at java.lang.reflect.Method.invoke(Method.java:511) 
09-26 12:43:21.949: E/AndroidRuntime(14618): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:993) 
09-26 12:43:21.949: E/AndroidRuntime(14618): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:760) 
09-26 12:43:21.949: E/AndroidRuntime(14618): at dalvik.system.NativeStart.main(Native Method) 

Questo è il mio codice:

public class DeleteRewardsFragment extends Fragment{ 

private Context context; 

private FragmentsActivity activity; 

private ListView listView; 
private View myFragmentView; 
private DeleteRewardsAdapter adapter; 
private String[] values; 

@SuppressLint("ResourceAsColor") 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 

    myFragmentView = inflater.inflate(R.layout.listview, container, false); 
    listView = (ListView) myFragmentView.findViewById(android.R.id.list); 


    activity = (FragmentsActivity) getActivity(); 
    context = activity.getApplicationContext(); 

    values = new String[4]; 

    adapter = new DeleteRewardsAdapter(context, values); 
    listView.setAdapter(adapter); 
    listView.setOnItemClickListener(deleteEvent); 

    return myFragmentView; 

} 

private OnItemClickListener deleteEvent = new OnItemClickListener() { 

    @Override 
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, 
      long arg3) { 
     AlertDialog.Builder alertDialog = new AlertDialog.Builder(context); 
     alertDialog .setTitle("Jetzt löschen?"); 
     alertDialog .setMessage("Die in deisem Store gesammelten stampss gehen debei verloren!") 
       .setCancelable(false) 
       .setPositiveButton("Abbrechen", new DialogInterface.OnClickListener() { 

        @Override 
        public void onClick(DialogInterface dialog, int which) { 
         values = new String[values.length-1]; 
         adapter = new DeleteRewardsAdapter(context, values); 
         listView.setAdapter(adapter); 
        } 
       }) 
       .setNegativeButton("Löschen", new DialogInterface.OnClickListener() { 

        @Override 
        public void onClick(DialogInterface dialog, int which) { 
         dialog.cancel(); 
        } 
       }); 

     AlertDialog dialog = alertDialog.create(); 
     dialog.show(); 

    } 
}; 

} 

Può qualcuno che mi aiuti?

risposta

40

Per aggiungere AlertDialog al numero Activity o Fragment, è necessario utilizzare l'istanza di Activity, non l'applicazione che si sta facendo nel codice. Crea il tuo AlertDialog in questo modo:

AlertDialog.Builder alertDialog = new AlertDialog.Builder(getActivity()); 

E che dovrebbe fare il trucco per voi! :)

+2

come farlo in un servizio? –

+0

@KaveeshKanwal qui: http://stackoverflow.com/a/31221469/6144372 Si può dire grazie dopo! :) –

2

Invia attività, piuttosto che contesto.

AlertDialog.Builder alertDialog = new AlertDialog.Builder(activity); 
7

Nel mio caso stavo cercando di creare la mia finestra come questa:

new Dialog(getApplicationContext()); 

così ho dovuto cambiare per:

new Dialog(MyActivity.this); 

Ed è iniziato a lavorare.

3

ho cambiato:

ProgressDialog(getApplicationContext()); 

a:

ProgressDialog(MainActivity.this); 

,

2

Qui di seguito sono le cose che potete fare per farla finita dal problema.

  1. Invece di utilizzare

    context
    si dovrebbe usare
    ActivityName.this

  2. se si utilizza getApplicationContext(), quindi utilizzare sotto la bandiera prima di utilizzare getApplicationContext()

    dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT)

Add la seguente autorizzazione al manifest:

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> 
1

ho cambiato getApplicationContext() a

activity.this 

funzionerà

Problemi correlati