Search code examples
androidandroid-linearlayoutandroid-dialogfragment

Custom LinearLayout calling method


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.


Solution

  • 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);
    }}