2016-11-17 3 views
0

С моей Recylerview Adapter, есть несколько кнопок в каждом Items, То, что я хочу, чтобы показать DialogFragment as confirmation когда они щелкают и выполнять различные методы/действия, когда positiveButton нажата.Реализация обратного вызова для DialogFragment

Проблема заключается в том, что я не знаю, как я могу или как реализовать обратный вызов при щелчке на positiveButton и может выполнять различные методы или действия в соответствии с тем, какую кнопку нужно щелкнуть по каждому элементу.

e.g. На моем классе адаптер

@Override 
public void onBindViewHolder(final PageOnlineAdapter.TheViewHolder holder, final int position) { 

    holder.btn_start.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      DialogFragment newFragment = ConfirmationDialog.newInstance(TITLE,CONTENT); //Initialize DialogFragment with a specific Title and Content 
      newFragment.show(((AppCompatActivity)contextView).getSupportFragmentManager(), TAG); 
      /* 
       if positiveButton is clicked 
        =>execute method/action here 
      */ 
     } 
    ); 

    holder.btn_stop.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      DialogFragment newFragment = ConfirmationDialog.newInstance(TITLE,CONTENT); //Initialize DialogFragment with a specific Title and Content 
      newFragment.show(((AppCompatActivity)contextView).getSupportFragmentManager(), TAG); 
      /* 
       if positiveButton is clicked 
        =>execute method/action here 
      */ 
     } 
    ); 

    holder.btn_close.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      DialogFragment newFragment = ConfirmationDialog.newInstance(TITLE,CONTENT); //Initialize DialogFragment with a specific Title and Content 
      newFragment.show(((AppCompatActivity)contextView).getSupportFragmentManager(), TAG); 
      /* 
       if positiveButton is clicked 
        =>execute method/action here 
      */ 
     } 
    ); 

    holder.btn_remove.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      DialogFragment newFragment = ConfirmationDialog.newInstance(TITLE,CONTENT); //Initialize DialogFragment with a specific Title and Content 
      newFragment.show(((AppCompatActivity)contextView).getSupportFragmentManager(), TAG); 
      /* 
       if positiveButton is clicked 
        =>execute method/action here 
      */ 
     } 
    ); 
} 

Вот мой DialogFragment Класс

public class ConfirmationDialog extends DialogFragment { 

    public static ConfirmationDialog newInstance(String title, String description) { 
     ConfirmationDialog frag = new ConfirmationDialog(); 
     Bundle args = new Bundle(); 
     args.putString("title", title); 
     args.putString("description", description); 
     frag.setArguments(args); 
     return frag; 
    } 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     String title = getArguments().getString("title"); 
     String description = getArguments().getString("description"); 
     return new AlertDialog.Builder(getActivity()) 
       //.setIcon(R.drawable.alert_dialog_icon) 
       .setTitle(title) 
       .setMessage(description) 
       .setPositiveButton("CONTINUE", 
         new DialogInterface.OnClickListener() { 
          public void onClick(DialogInterface dialog, int whichButton) { 
           //How to tell when this positiveButton is clicked 
          } 
         } 
       ) 
       .setNegativeButton("CANCEL", 
         new DialogInterface.OnClickListener() { 
          public void onClick(DialogInterface dialog, int whichButton) { 
           //How to tell when this negativeButton is clicked 
          } 
         } 
       ) 
       .create(); 
    } 
} 
+0

Вы планируете выполнять разные операции, когда в каждой кнопке нажата положительная кнопка, или вы будете делать то же самое во всех них? –

+0

Да, я планирую сделать другую операцию, когда щелкнут postiveButton. – Polar

+0

Я удивлен, если ниже решение не будет бросать нулевой указатель, если вы повернули экран с открытым диалогом и попытались выполнить обратный вызов. Это диалог FRAGMENT, поскольку он имеет свой собственный жизненный цикл, и вы можете реализовать методы onAttach onDetach, как и фрагмент, - здесь вы должны внедрять обратный вызов интерфейса.Обратный вызов для операции, которая предоставила ссылку FragmentManager. –

ответ

0

Опцион бы создать интерфейс, который будет реализован с помощью адаптера и передается dialogframe когда это создавая его. Dialogframe может затем вызвать определенный метод, когда положительный щелкают и еще один, когда негатив щелкнул:

public interface DialogCallback{ 

    void clickedPositiveStart(); 
    void clickedPositiveStop(); 
    void clickedNegativeStart(); 
    void clickedNegativeStop(); 
} 




public class MyAdapter extends Adapter implements DialogCallback, View.OnClickListener{ 

    @Override 
    protected void onClick(View view){ 
     DialogFragment newFragment = null; 
     String action; 

     if(view.getId() == R.id.your_start_button){ 
      action = "start"; 
     }else if(view.getId() == R.id.your_stop_button){ 
      action = "stop";  
     }else if(..){ 
      .... 
     }else{ 
      return; 
     } 

     newFragment = ConfirmationDialog.newInstance(TITLE,CONTENT, this, action); 
     newFragment.show(((AppCompatActivity)contextView).getSupportFragmentManager(), TAG); 
    } 

    @Override 
    public void clickedPositiveStart(){ 
     // do something when positive is clicked 
    } 

    @Override 
    public void clickedPositiveStop(){ 
     // do something when positive is clicked 
    } 

    @Override 
    public void clickedNegativeStart(){ 
     // do something when negative is clicked 
    } 

    @Override 
    public void clickedNegativeStop(){ 
     // do something when negative is clicked 
    } 

} 


public ConfirmationDialog extends Dialogfragment{ 

    private DialogCallback callback; 
    private String action; 

    public static ConfirmationDialog newInstance(String title, String description, DialogCallback callback, String action) { 
     this.callback = callback; 
     this.action = action; 
     ... 
    } 


@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 
    String title = getArguments().getString("title"); 
    String description = getArguments().getString("description"); 
    return new AlertDialog.Builder(getActivity()) 
      //.setIcon(R.drawable.alert_dialog_icon) 
      .setTitle(title) 
      .setMessage(description) 
      .setPositiveButton("CONTINUE", 
        new DialogInterface.OnClickListener() { 
         public void onClick(DialogInterface dialog, int whichButton) { 
          if(action.equals("start"){ 
           callback.clickedPositiveStart(); 
          } else if(action.equals("stop"){ 
           callback.clickedPositiveStop(); 
          } 
         } 
        } 
      ) 
      .setNegativeButton("CANCEL", 
        new DialogInterface.OnClickListener() { 
         public void onClick(DialogInterface dialog, int whichButton) { 

          if(action.equals("start"){ 
           callback.clickedNegativeStart(); 
          } else if(action.equals("stop"){ 
           callback.clickedNegativeStop(); 
          } 
         } 
        } 
      ) 
      .create(); 
    } 
} 

} 
+0

Привет, я очень ценю ваш ответ, но Я не могу заставить его работать. Можете ли вы адаптировать его в код моего фрагмента? – Polar

+0

@Polar Вместо того, чтобы выполнять код в событии on-click при щелчке по положительной кнопке, вы выполняете его в методах, предоставляемых интерфейсом в вашем классе адаптера. Это был просто пример, я не знаю, что именно вы хотите выполнить, когда нажата кнопка «положительная/отрицательная». –

+0

@Polar Я отредактировал мой пост, это то, что вы ищете? –

0

Прежде всего, я хотел бы сказать спасибо Merve Sahin за идею создания Interface.

Вместо принятого ответа, я использую приведенный ниже код. Это делает меня одним классом DialogFragment и использовал его для многих случаев. e.g.Calling by Multiple Buttons and response according to what button is clicked.

Во-первыхам, Вам необходимо import следующим:

import android.app.AlertDialog; 
import android.app.Dialog; 
import android.content.DialogInterface; 
import android.os.Bundle; 
import android.support.v4.app.DialogFragment; 

И для AlertDialog, Создать класс:

public class ConfirmDialog extends DialogFragment { 

    public static final String TITLE = "title", CONTENT = "content"; 
    private OnContinueCancelClick continueCancelClick; 

    public static ConfirmDialog newInstance(String title, String content) { 
     ConfirmDialog frag = new ConfirmDialog(); 
     Bundle args = new Bundle(); 
     args.putString(TITLE, title); 
     args.putString(CONTENT, content); 
     frag.setArguments(args); 
     return frag; 
    } 

    public void setOnContinueCancelClick(OnContinueCancelClick continueCancelClick) { 
     this.continueCancelClick = continueCancelClick; 
    } 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     String title = getArguments().getString(TITLE); 
     String content = getArguments().getString(CONTENT); 
     AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
     builder.setTitle(title).setMessage(content) 
       .setNegativeButton("CANCEL", new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface arg0, int arg1) { 
         if(continueCancelClick != null) 
          continueCancelClick.onCancelClicked(); 
        } 
       }) 
       .setPositiveButton("CONTINUE", new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface arg0, int arg1) { 
         if(continueCancelClick != null) 
          continueCancelClick.onContinueClicked(); 
        } 
       }); 
     Dialog dialog = builder.create(); 
     return dialog; 

    } 

    //Declare an Interface 
    public interface OnContinueCancelClick{ 
     void onContinueClicked(); 
     void onCancelClicked(); 
    } 
} 

и при показе диалога и вам нужно получить кнопку нажали, скажем, по моему состоянию:

holder.btn_start.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     /** Start the Dialog Here **/ 

      ConfirmDialog confirmDialog = ConfirmDialog.newInstance("Titile of Dialog","Content or Description of Dialog"); //Setup Dialog 
      confirmDialog.show(((AppCompatActivity)contextView).getSupportFragmentManager(), "confirmDialog"); //Show the Dialog 
      confirmDialog.setOnContinueCancelClick(new ConfirmDialog.OnContinueCancelClick(){ //listen on Clicked Button 
        @Override 
        public void onContinueClicked() { 
         //Do some operation or call some functions when Continue button is Clicked 
        } 
        @Override 
        public void onCancelClicked() { 
         //Do Nothing or Do some operation or call some functions when Cancel button is Clicked 
        } 
       }); 

     /** END **/ 
    } 
); 

Вы можете сделать то же самое с заказ Посмотреть или Layout

public class ConfirmDialog extends DialogFragment { 

    private Button btnCancel, btnContinue; 

    public static final String TITLE = "title", CONTENT = "content"; 
    private OnContinueCancelClick continueCancelClick; 

    public static ConfirmDialog newInstance(String title, String content) { 
     ConfirmDialog frag = new ConfirmDialog(); 
     Bundle args = new Bundle(); 
     args.putString(TITLE, title); 
     args.putString(CONTENT, content); 
     frag.setArguments(args); 
     return frag; 
    } 

    public void setOnContinueCancelClick(OnContinueCancelClick continueCancelClick) { 
     this.continueCancelClick = continueCancelClick; 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     return inflater.inflate(R.layout.dialog_custom_layout, container); 
    } 

    @Override 
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 
     super.onViewCreated(view, savedInstanceState); 

     //Some initialization or condition here... 
     btnCancel = (Button)view.findViewById(R.id.btn_cancel); //Intialize your Cancel Button 
     btnContinue = (Button)view.findViewById(R.id.btn_continue); //Intialize your Continue Button 

     getDialog().setTitle(getArguments().getString(TITLE)); //Set the Title 

     btnCancel.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if(continueCancelClick != null) 
        continueCancelClick.onCancelClicked(); //Return this 
       dismiss(); //Close the Dialog when Done 
      } 
     }); 

     btnContinue.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if(continueCancelClick != null) 
        continueCancelClick.onContinueClicked(); //Return this 
       dismiss(); //Close the Dialog when Done 
      } 
     }); 
    } 

    public interface OnContinueCancelClick{ 
     void onContinueClicked(); 
     void onCancelClicked(); 
    } 
} 

Это может помочь другим, так что я после моего решения с помощью использования интерфейса.

Это Question ответ Nepster также поможет мне в этом.

Надеюсь, это поможет вам, ребята.

 Смежные вопросы

  • Нет связанных вопросов^_^