I'm trying to implement a custom LinearLayout that shows a DialogFragment. I did all, and it works great, the Dialog is showing and working perfectly, but I can't seem to get the data from the DialogFragment.
So I've created an interface:
public interface DialogCommunicator {void onDismiss(String format, String data);}
On the LinearLayout I've implemented the DialogCommunicator interface and done this:
public class CustomLayout extends LinearLayout implements DialogCommunicator, View.OnClickListener {
Button showDialog;
TextView displayUserInput;
CreateDialog dialog;
public CustomLayout(Context context) {
super(context);
}
public CustomLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CustomLayout(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
showDialog = (Button) findViewById(R.id.showDialog);
displayUserInput = (TextView) findViewById(R.id.displayUserInput);
showDialog.setOnClickListener(this);
}
@Override
public void onDismiss(String format, String data) {
dialog.dismiss();
someMethod(format, data);
}
private void someMethod(String format, String data) {
displayUserInput.setText(format + data);
}
@Override
public void onClick(View v) {
AppCompatActivity activity = (AppCompatActivity) getContext();
dialog = new CreateDialog();
dialog.show(activity.getSupportFragmentManager(), "Mydialog");
}}
On the DialogFragment I did this, but activity is allways null:
public class CreateDialog extends DialogFragment implements DialogCommunicator, View.OnClickListener {
View view;
String format, data;
Button create;
EditText userFormat, userData;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
view = inflater.inflate(R.layout.create_barcode, container);
userFormat = (EditText) view.findViewById(R.id.userFormat);
userData = (EditText) view.findViewById(R.id.userData);
create = (Button) view.findViewById(R.id.create);
create.setOnClickListener(this);
return view;
}
@Override
public void onDismiss(String format, String data) {
RTToolbarHorizontalLayout layout = (RTToolbarHorizontalLayout) getHost();
if (layout != null) {
layout.onDismiss(format, data);
}
}
@Override
public void onClick(View v) {
format = userFormat.getText().toString();
data = userData.getText().toString();
onDismiss(format, data);
}
}
I've tried getContext(), getDialog(), getHost() but they are all null.
I've used an broadcast receiver so send data from the DialogFragment to the layout. Here is the CustomLayout:
public class CustomLayout extends LinearLayout implements View.OnClickListener {
Button showDialog;
TextView displayUserInput;
CreateDialog dialog;
BroadcastReceiver receiver = new BroadcastReceiver() {
String format = null;
String data = null;
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getStringExtra("format") != null)
format = intent.getStringExtra("format");
if (intent.getStringExtra("barcode") != null)
data = intent.getStringExtra("barcode");
if (format != null && data != null) {
someMethod(format, data);
format = null;
data = null;
}
}
};
public CustomLayout(Context context) {
super(context);
getContext().registerReceiver(receiver,
new IntentFilter("com.exemple.myapplication.DATA_SEND"));
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
getContext().unregisterReceiver(receiver);
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
showDialog = (Button) findViewById(R.id.showDialog);
displayUserInput = (TextView) findViewById(R.id.displayUserInput);
showDialog.setOnClickListener(this);
}
private void someMethod(String format, String data) {
displayUserInput.setText(format + data);
}
@Override
public void onClick(View v) {
AppCompatActivity activity = (AppCompatActivity) getContext();
dialog = new CreateDialog();
dialog.show(activity.getSupportFragmentManager(), "MyDialog");
}}
Here is the implementation in the DialogFragment:
public class CreateDialog extends DialogFragment implements View.OnClickListener {
View view;
String format, data;
Button create;
EditText userFormat, userData;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
view = inflater.inflate(R.layout.create_barcode, container);
userFormat = (EditText) view.findViewById(R.id.userFormat);
userData = (EditText) view.findViewById(R.id.userData);
create = (Button) view.findViewById(R.id.create);
create.setOnClickListener(this);
return view;
}
@Override
public void onClick(View v) {
format = userFormat.getText().toString();
data = userData.getText().toString();
Intent i = new Intent("com.exemple.myapplication.DATA_SEND");
i.putExtra("format", format);
i.putExtra("data", data);
getContext().sendBroadcast(i);
}}