6

Ich habe eine DialogFragment, die im Vollbildmodus mit setStyle(STYLE_NORMAL, R.style.Theme_App) formatiert ist.Nach oben ActionBar Aktion auf DialogFragment

Die DialogFragment zeigt gut, aber die Aktion oben (die homeAsUp Aktion auf der ActionBar) funktioniert nicht. Ich habe versucht, onOptionsItemSelected in der DialogFragment zu implementieren, aber es wird nie aufgerufen.

Gibt es eine Möglichkeit, den Aufruf der Aktion nach oben in der DialogFragment zu erhalten, damit ich es ablehnen kann? Als Referenz verwende ich ActionBarCompat.

+0

was ist die Aktion? –

+0

Bearbeitet, um zu bearbeiten –

+0

Zeigen Sie Aktionsleiste im Dialogfeld? – Weibo

Antwort

9

Es gibt keine Art und Weise ist eine ActionBar zum DialogFragment selbst zu befestigen, obwohl Sie das Thema des DialogFragment einstellen kann es nicht als ActionBar, um es registrieren, Dialog.getActionBar() wird immer null zurück.

Anstelle der ActionBar können Sie immer ein Layout anhängen, das wie eine ActionBar aussieht und die Funktionalität über das Menü einstellen.

Der andere Weg ist eine Aktivität mit ActionBar als Dialog erstellen Sie in diesem post

+1

Leider scheint das zur Zeit die richtige Antwort zu sein –

+0

Es gibt einen Weg, stattdessen eine Symbolleiste anzuhängen, die etwa genauso funktioniert wie actionbar. Hier: http://stackoverflow.com/a/38917527/878126 –

2

Damit das DialogFragment Aufrufe an onOptionsItemSelected(MenuItem item) empfängt, benötigen Sie in der onCreate() - Methode des Fragments den Satz setHasOptionsMenu(true);.

Eine andere mögliche Lösung besteht darin, die Aufwärtsaktion in den Aktivitäten onOptionsItemSelected(MenuItem item) Callback zu behandeln. Etwas wie folgt aus:

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
    case android.R.id.home: 
     // Respond to the action bar's Up/Home button 
     onBackPressed(); 
     return true; 
    } 
} 
+0

Versuchte diese. Scheint nicht zu funktionieren. –

1

Der folgende Code für mich gearbeitet beziehen:

@Override 
     public boolean onOptionsItemSelected(MenuItem item) { 
      switch (item.getItemId()) { 
      // Respond to the action bar's Up/Home button 
      case android.R.id.home: 
       NavUtils.navigateUpFromSameTask(this); 
       return true; 
      } 
      return super.onOptionsItemSelected(item); 
     } 

this helps :)

+0

Nein ... es wird nie aufgerufen. Und das Argument zu "navigateUpFromSameTask" kann kein DialogFragment sein. –

2

Delegieren Sie die Aktion up von der Komponente, die sie empfängt (dh die übergeordnete Aktivität oder das Fragment), an Ihr DialigFragment. Wenn up auftritt, überprüfen Sie, ob Ihr DialogFragment angezeigt wird, und wenn dies der Fall ist, rufen Sie die entsprechende Methode auf.

2

Auschecken here für detaillierte Beschreibung.

Ich löste dieses Problem durch Hinzufügen der folgenden Codierung.

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
     case android.R.id.home: 
      onBackPressed(); 
      return true; 
     } 

    return super.onOptionsItemSelected(item); 
} 

In MainActivity:

Zuvor

public class MainActivity erweitert BaseActivity

Dann habe ich in

ändern

public class MainActivity erweitert FragmentActivity

Wahrscheinlich müssen Sie eine MainActivity to FragmentActivity.

+0

Warten? Sie erhalten diesen Rückruf im 'DialogFragment' ?? –

+0

@SaadFarooq yes In DialogFragment müssen Sie Intent verwenden, um es für die Navigationsleiste der Aktionsleiste an diese Aktivität zu übergeben. – Steve

+0

Nein gehts ... Und wo ist die Absicht? –

13

verlängern dies nicht möglich war, aber es gibt eine Abhilfe für dieses eine Toolbar verwenden. Jetzt können Sie Toolbar als Teil Ihrer DialogFragmentlayout xml einschließen und sein Design/Symbol entsprechend Ihren Notwendigkeiten einstellen. Sie müssen auch setNavigationOnClickListener implementieren, wenn Sie möchten, dass sich die Zurück-Schaltfläche wie gewohnt verhält. Siehe die folgende Beispielklasse.

package com.package.name; 

import android.app.Dialog; 
import android.os.Bundle; 
import android.support.annotation.NonNull; 
import android.support.annotation.Nullable; 
import android.support.v4.app.DialogFragment; 
import android.support.v7.widget.Toolbar; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.ImageView; 
import android.widget.LinearLayout; 



public class MyDialogFragment extends DialogFragment { 
    private View parentView; 
    private Toolbar toolbar; 


    @NonNull 
    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     setStyle(DialogFragment.STYLE_NO_FRAME, R.style.Theme_AppCompat_NoActionBar); 
     return super.onCreateDialog(savedInstanceState); 
    } 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     //The layout xml file contains the toolbar 
     parentView = inflater.inflate(R.layout.dialogfragment_createpost, container, false); 
     initView(); 
     initData(); 
     return parentView; 
    } 


    private void initView() { 
     toolbar = (Toolbar) parentView.findViewById(R.id.toolbar); 

    } 

    private void initData() { 
     toolbar.setTitle("Post"); 
     //Set naviagtion icon to back button drawable 
     toolbar.setNavigationIcon(R.drawable.abc_ic_ab_back_mtrl_am_alpha); 
     toolbar.setNavigationOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
// handle back button naviagtion 
       dismiss(); 
      } 
     }); 
    } 
} 
0

Symbolleiste im Layout definieren und rufen Sie es auf Ihrem Dialogfragment

Toolbar toolbar=dialog.findViewById(R.id.toolbar); 
          toolbar.setNavigationIcon(R.drawable.ic_arrow_back_black_24dp); 
          toolbar.setOnClickListener(new View.OnClickListener() { 
           @Override 
           public void onClick(View view) { 
            dialog.dismiss(); 
           } 
          }); 
Verwandte Themen