2015-10-20 4 views
8

Ho un frammento in cui ho bisogno di mostrare una finestra di dialogo personalizzata.La funzionalità della finestra deve essere richiesta prima di aggiungere il contenuto mentre si implementa la finestra di dialogo in frammento

Si prega di controllare il mio codice qui sotto.

public class MyFragment extends Fragment{ 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View rootView = inflater.inflate(R.layout.send_layout, container, false); 
    TextView txtView = (TextView) rootView.findViewById(R.id.tv); 

    txtView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      openDialog(); 
     } 
    }); 
    return rootView; 
    } 
    public void openDialog(){ 
     AppCompatDialog dialog = new AppCompatDialog(getContext(), R.style.package_types__dialog); 
     dialog.setContentView(R.layout.package_types_dialog); 
     dialog.show(); 
    } 
} 

Quando si rimuove la linea:

dialog.setContentView(R.layout.package_types_dialog); 

non v'è alcun errore, ma se uso lo stesso il seguente errore sta gettando:

FATAL EXCEPTION: main 
10-20 19:42:57.489 23866-23866/in.edelworks.pickedup E/AndroidRuntime: Process: in.edelworks.pickedup, PID: 23866 
10-20 19:42:57.489 23866-23866/in.edelworks.pickedup E/AndroidRuntime: android.util.AndroidRuntimeException: Window feature must be requested before adding content 
10-20 19:42:57.489 23866-23866/in.edelworks.pickedup E/AndroidRuntime:  at android.support.v7.app.AppCompatDelegateImplV7.throwFeatureRequestIfSubDecorInstalled(AppCompatDelegateImplV7.java:1584) 
10-20 19:42:57.489 23866-23866/in.edelworks.pickedup E/AndroidRuntime:  at android.support.v7.app.AppCompatDelegateImplV7.requestWindowFeature(AppCompatDelegateImplV7.java:509) 
10-20 19:42:57.489 23866-23866/in.edelworks.pickedup E/AndroidRuntime:  at android.support.v7.app.AppCompatDelegateImplBase.onCreate(AppCompatDelegateImplBase.java:117) 
10-20 19:42:57.489 23866-23866/in.edelworks.pickedup E/AndroidRuntime:  at android.support.v7.app.AppCompatDelegateImplV7.onCreate(AppCompatDelegateImplV7.java:148) 
10-20 19:42:57.489 23866-23866/in.edelworks.pickedup E/AndroidRuntime:  at android.support.v7.app.AppCompatDialog.onCreate(AppCompatDialog.java:60) 
10-20 19:42:57.489 23866-23866/in.edelworks.pickedup E/AndroidRuntime:  at android.app.Dialog.dispatchOnCreate(Dialog.java:361) 
10-20 19:42:57.489 23866-23866/in.edelworks.pickedup E/AndroidRuntime:  at android.app.Dialog.show(Dialog.java:262) 
+0

provare impostando l'ascoltatore onClick in –

+0

aggiornamento OnStart la versione AppCompat a v22.1.0 – MKJParekh

risposta

-2

Perdonami se non sono io rispondendo direttamente alla tua domanda ma ti suggerirò una soluzione alternativa.

Non ho usato direttamente AppCompatDialog ma ho usato AlertDialog con AppCompatTheme. Trovo AlertDialog per essere molto semplice in termini di utilizzo.

Answer here fornisce un ottimo esempio di come utilizzare AlertDialog.

Spero che aiuti.

0

Sostituire onCreateDialog e utilizzare invece AlertDialog Builder v7. o

AlertDialog.Builder bulder = new AlertDialog.Builder(this); 
bulder 
.setCancelable(false) 
.setPositiveButton("OK", new DialogInterface.OnClickListener() { 
public void onClick(DialogInterface dialog, int id) { 

} 
}) 
.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
    public void onClick(DialogInterface dialog, int id) { 
     dialog.cancel(); 
    } 
}); 
bulder.setTitle("Title"); 
bulder.setView(getLayoutInflater().inflate(R.layout.dialog, null)); 
AlertDialog dialog = bulder.create(); 
dialog.show(); 
0

Ecco bug che appare in libreria la versione 23.0.0, ed è stato rilasciato una correzione nella versione 23.0.1. Ma alcuni utenti segnalano che il problema continua a essere visualizzato.

Source

Una cosa che si può provare è ignorare onCreateDialog e utilizzare un v7 AlertDialog Builder, invece. Per ora usa semplicemente DialogFragment, ma otterrai una AppCompatDialog se usi il v7 Builder e un setView personalizzato.

0

Il tuo errore è un bug, è stato corretto nella libreria di supporto 23.0.1. Si potrebbe provare con v7 AlertDialog.BuilderonCreateDialog():

@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
    builder.setTitle("Simple Dialog"); 
    builder.setMessage("Some message here"); 

    builder.setPositiveButton("Ok", new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
     dismiss(); 
    } 
}); 

builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
    @Override 
    public void onClick(DialogInterface dialog, int which) { 
     dismiss(); 
    } 
}); 

    return builder.create(); 
} 
1

Ho implementato e provato molte alternative per il vostro tipo di situazione, sta funzionando davvero bene, in modo che non ho potuto avere la possibilità di rivedere il vostro errore. Ma quello che posso suggerirti è sostituire AppCompatDialog con AlertDialog.Builder che è una classe di android.support.v7.app.

sostituire questo codici

public void openDialog(){ 
     AppCompatDialog dialog = new AppCompatDialog(getContext(), R.style.package_types__dialog); 
     dialog.setContentView(R.layout.package_types_dialog); 
     dialog.show(); 
    } 

con

public void openDialog(){  
     AlertDialog.Builder dialog = new AlertDialog.Builder(getContext(),R.style.package_types__dialog);  
     dialog.setView(R.layout.package_types_dialog); 
    } 

Nota:

E se avete tutte le classi che gestisce gli eventi dialog quindi estendere DialogFragment di android.support.v4.app.DialogFragment. e non dimenticare di sovrascrivere il metodo onCreateDialog.La classe completo sarà simile a questa

import android.os.Bundle; 
import android.support.v4.app.DialogFragment; 

/** 
* Created by Shreekrishna on 2/29/2016. 
*/ 
public class PackageTypesDialog extends DialogFragment { 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     return super.onCreateDialog(savedInstanceState); 
    } 
} 

Questo sarà probabilmente risolvere il tuo problema!

0

devi usare sotto il codice per impostare la visualizzazione personalizzata nella finestra di avviso. Questo codice funziona nel mio progetto.

AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this); 
// ...Irrelevant code for customizing the buttons and title 
LayoutInflater inflater = this.getLayoutInflater(); 
View dialogView = inflater.inflate(R.layout.alert_label_editor, null); 
dialogBuilder.setView(dialogView); 

EditText editText = (EditText) dialogView.findViewById(R.id.label_field); 
editText.setText("test label"); 
AlertDialog alertDialog = dialogBuilder.create(); 
alertDialog.show(); 
0

Nel mio caso, una libreria aveva una dipendenza dalla libreria appcompat v23.1.1. Costringendo la libreria a utilizzare la versione corrente dell'app, la libreria compat ha risolto il problema.

Per visualizzare la gerarchia delle dipendenze è possibile utilizzare il seguente comando:

gradlew -p MODULE_NAME dependencies 

Dove NOME_MODULO è il nome del vostro modulo app (di solito solo 'app')

Per forzare la libreria per aggiornare il dipendenza:

compile('com.example.m:m:1.0') { 
    exclude group: 'com.android.support', module: 'appcompat-v7' 
}