2014-12-26 6 views
8

In meiner android app, erstelle ich einen Dialog wie folgt aus:Wie behebt man "Vermeiden Sie Null als View-Root" in Android?

private void handleEdit() { 
    LayoutInflater inflater = getLayoutInflater(); 
    View dialoglayout = inflater.inflate(R.layout.dialog_gallery, null); 

    final AlertDialog d = new AlertDialog.Builder(this) 
    .setView(dialoglayout) 
    .setTitle(R.string.edit) 
    .setNegativeButton(R.string.cancel, null) 
    .create(); 

    CheckBox mainCB = (CheckBox)dialoglayout.findViewById(R.id.main); 
    CheckBox usedCB = (CheckBox)dialoglayout.findViewById(R.id.used); 
    mainCB.setChecked(image.getIsMain()); 
    usedCB.setChecked(image.getApproved()); 

    mainCB.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View arg0) { 
      if (Network.isNetworkAvailable(GalleryScreen.this)) { 
       new Async_update_image_state(GalleryScreen.this, fish, image, !image.getIsMain(), image.getApproved(), false); 
       d.dismiss(); 
      } else { 
       Popup.ShowErrorMessage(GalleryScreen.this, R.string.no_internet, false); 
      } 
     } 
    }); 

    usedCB.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View arg0) { 
      if (Network.isNetworkAvailable(GalleryScreen.this)) { 
       new Async_update_image_state(GalleryScreen.this, fish, image, false, !image.getApproved(), true); 
       d.dismiss(); 
      } else { 
       Popup.ShowErrorMessage(GalleryScreen.this, R.string.no_internet, false); 
      } 
     } 
    }); 

    d.show(); 
} 

Aber ich erhalte eine Warnung auf View dialoglayout = inflater.inflate(R.layout.dialog_gallery, null); die null unterstreicht.

Avoid passing null as the view root (needed to resolve layout parameters on the inflated layout's root element) 

Was bedeutet das und wie kann ich es beheben?

Danke.

+1

http://stackoverflow.com/questions/24832497/avoid-passing-null-as-the-view-root-need-to-resolve-layout-parameters-on-the-in –

+0

http: // stackoverflow .com/questions/26404951/move-passing-null-als-die-ansicht-root-warning-wenn-aufblasen-view-for-use-by-ale –

+1

In diesem Fall ist es OK, Null zu übergeben. Fügen Sie eine Annotation "@ SuppressLint" hinzu, damit Sie nicht belästigt werden. –

Antwort

8

Wenn ein Layout für die Verwendung in einem Dialog aufblasen können Sie sicher null hier passieren und die Warnung ignorieren.

Von This Link

Das Problem hier ist, dass AlertDialog.Builder eine benutzerdefinierte Ansicht unterstützt, aber unterstützt keine Implementierung von setView(), die ein Layout Ressource nimmt; Sie müssen also das XML manuell aufblasen. Da jedoch das Ergebnis in den Dialog gehen, die nicht Ansicht der Wurzel aussetzt (in der Tat ist es noch nicht vorhanden ist), wir haben keinen Zugriff auf die eventuell Eltern des Layouts, also können wir nicht verwenden es für die Inflation. Es stellt sich heraus, dies irrelevant ist, weil alle Alertdialog LayoutParams auf das Layout sowieso gelöscht werden und ersetzt sie durch match_parent.

+0

Ich möchte @SuppressWarnings dafür verwenden, weiß aber nicht, was zu verwenden ist; irgendwelche Ideen? - bearbeiten - Found it, @SuppressWarnigns ("InflateParams") – linuxgnuru

0

Statt

inflater.inflate(R.layout.dialog_gallery, null); 

versuchen

inflater.inflate(R.layout.dialog_gallery, null, false); 

Es wird nicht im Hinblick auf die Eltern anhängen, die in Ihrem Fall null ist.

Details siehe Android Reference

+0

es versucht, aber immer noch die Warnung. Diese – omega

+0

ist sinnlos, denn wenn man den Quellcode des Android aussehen werden Sie diese Implementierung sehen: 'Public View aufblasen (int Ressource, Viewgroup root) { return aufblasen (! Ressource, Wurzel, root = null); } '. Ich meine, früher oder später wird es genau den gleichen Effekt haben. –

11

das für mich arbeitet

View.inflate(getActivity(), R.layout.dialog, null); 

ohne Warnungen noch Fehler.

+0

ist dies die richtige Antwort nach http://stackoverflow.com/a/26596164/1708390 –

1

Statt:

inflater.inflate(R.layout.dialog_gallery, null); 

tun:

inflater.inflate(R.layout.dialog_gallery, parent, false); 

ein @SuppressLint annotation Verwendung als von Eugen im Kommentar vorgeschlagen oben könnte die Warnung "unterdrücken", aber es löst nicht das Problem. Die Verwendung von null als Argument für die ViewGroup führt in Zukunft zu Problemen.