【问题标题】:Custom LinearLayout calling method自定义LinearLayout调用方法
【发布时间】:2016-09-24 02:07:19
【问题描述】:

我正在尝试实现一个显示 DialogFragment 的自定义 LinearLayout。我做了所有的事情,效果很好,对话框显示和工作完美,但我似乎无法从 DialogFragment 获取数据。

所以我创建了一个界面:

public interface DialogCommunicator {void onDismiss(String format, String data);}

在 LinearLayout 上,我实现了 DialogCommunicator 接口并做到了这一点:

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

在 DialogFragment 上我这样做了,但活动始终为空:

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

我尝试过getContext()、getDialog()、getHost(),但它们都是空的。

【问题讨论】:

  • 能把代码全部加进去,会更清楚
  • 我已经添加了整个班级。

标签: android android-linearlayout android-dialogfragment


【解决方案1】:

我使用了广播接收器,因此将数据从 DialogFragment 发送到布局。这是自定义布局:

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

这是 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);
}}

【讨论】:

    猜你喜欢
    • 2013-07-25
    • 1970-01-01
    • 2021-12-28
    • 2012-07-31
    • 1970-01-01
    • 2014-10-12
    • 2021-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多