Reputation: 3537
From my Recylerview Adapter
, there are multiple buttons in every Items,
What I want is to show the DialogFragment as confirmation
when they are clicked and execute a different methods/actions when the positiveButton
is clicked.
The problem is I don't know how can I have or how can I implement a callback when the positiveButton
is clicked and can execute a different methods or actions according to what button is to be clicked on every items.
e.g.
On my Adapter Class
@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
*/
}
);
}
Here's my DialogFragment Class
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();
}
}
Upvotes: 0
Views: 6374
Reputation: 3537
First of all, I would like to say Thanks to Merve Sahin for the idea of creating Interface
.
Instead of the accepted answer, I endup using the below code.
This makes me have one class of DialogFragment
and used it for many cases e.g.
Calling by Multiple Buttons and response according to what button is clicked
.
First, You need to import
the following:
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
And for AlertDialog, Create a class:
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();
}
}
and when showing the Dialog and you need to get clicked button, let say on my condition:
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 **/
}
);
You can do the same with a Custom View or 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();
}
}
This could help others so I post my solution with the help of using interface.
This Question answer by Nepster also help me a lot to accomplish this.
Hope this help you guys.
Upvotes: 6
Reputation: 1048
An option would be to create an interface that is going to be implemented by the Adapter and passed to the dialogframe when creating it. The dialogframe could then invoke a certain method when positive is clicked and another one when negative is clicked :
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();
}
}
}
Upvotes: 0