如何在 java class 不扩展 Activity 中使用 LayoutInflater 从 xml 文件获取视图

How to get a View from xml file using LayoutInflater in a java class not extending Activity

我有一个 java class,我在其中显示一个使用 XML 布局文件的对话框。我想动态设置布局的text/contents。

为了实现这一点,我正在编写这样的方法:

private void setContentMessage(String theMessage)
{
    View contentView = LayoutInflater.from(context).inflate(R.layout.dialog_content, null, false);

    TextView titleMessage = (TextView) contentView.findViewById(R.id.title_message);
    titleMessage.setText(theMessage);
}

所以在 inflate 方法中我使用 null 因为我不知道该用什么。

通常,我们使用 ViewGroup 对象作为 inflate 方法中的第二个参数,但我不知道如何在 java class 中创建一个 ViewGroup 而不扩展 Activity。

我上面写的函数是在对话框布局里面不改变。所以请告诉我如何在 java class.

中膨胀布局

AmitSmartDialog.java

package com.amitupadhyay.touchme.utility;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import android.widget.Toast;

import com.amitupadhyay.touchme.R;
import com.orhanobut.dialogplus.DialogPlus;
import com.orhanobut.dialogplus.Holder;
import com.orhanobut.dialogplus.OnCancelListener;
import com.orhanobut.dialogplus.OnClickListener;
import com.orhanobut.dialogplus.OnDismissListener;
import com.orhanobut.dialogplus.OnItemClickListener;
import com.orhanobut.dialogplus.ViewHolder;

/**
 * Created by aupadhyay on 12/9/16.
 */

public class AmitSmartDialog {

    Context context;

    public AmitSmartDialog(Context context) {
        this.context = context;
    }

    public void showDialog(int holderId, int gravity, boolean showHeader, boolean showFooter, boolean expanded, String message) {

        setContentMessage(message);
        Holder holder;
        holder = new ViewHolder(R.layout.dialog_content);

        OnClickListener clickListener = new OnClickListener() {
            @Override
            public void onClick(DialogPlus dialog, View view) {
                switch (view.getId()) {
                    case R.id.like_it_button:
                        Toast.makeText(context, "We're glad that you like it", Toast.LENGTH_LONG).show();
                        break;
                    case R.id.love_it_button:
                        Toast.makeText(context, "We're glad that you love it", Toast.LENGTH_LONG).show();
                        break;
                }
                dialog.dismiss();
            }
        };

        OnItemClickListener itemClickListener = new OnItemClickListener() {
            @Override
            public void onItemClick(DialogPlus dialog, Object item, View view, int position) {

            }
        };

        OnDismissListener dismissListener = new OnDismissListener() {
            @Override
            public void onDismiss(DialogPlus dialog) {

            }
        };

        OnCancelListener cancelListener = new OnCancelListener() {
            @Override
            public void onCancel(DialogPlus dialog) {

            }
        };

        showCompleteDialog(holder, gravity, new BaseAdapter() {
                    @Override
                    public int getCount() {
                        return 0;
                    }
                    @Override
                    public Object getItem(int i) {
                        return null;
                    }
                    @Override
                    public long getItemId(int i) {
                        return 0;
                    }
                    @Override
                    public View getView(int i, View view, ViewGroup viewGroup) {
                        return null;
                    }
                }, clickListener, itemClickListener, dismissListener, cancelListener,
                expanded);

    }

    private void showCompleteDialog(Holder holder, int gravity, BaseAdapter adapter,
                                    OnClickListener clickListener, OnItemClickListener itemClickListener,
                                    OnDismissListener dismissListener, OnCancelListener cancelListener,
                                    boolean expanded) {
        final DialogPlus dialog = DialogPlus.newDialog(context)
                .setContentHolder(holder)
                .setHeader(R.layout.dialog_header)
                .setCancelable(false)
                .setGravity(gravity)
                .setAdapter(adapter)
                .setOnClickListener(clickListener)
                .setOnItemClickListener(new OnItemClickListener() {
                    @Override public void onItemClick(DialogPlus dialog, Object item, View view, int position) {
                    }
                })
                .setOnDismissListener(dismissListener)
                .setExpanded(expanded)
                .setContentHeight(ViewGroup.LayoutParams.WRAP_CONTENT)
                .setOnCancelListener(cancelListener)
                .setOverlayBackgroundResource(android.R.color.transparent)
                .create();
        dialog.show();
    }


    private void setContentMessage(String theMessage)
    {
        Toast.makeText(context, "HI BRO", Toast.LENGTH_SHORT).show();

        View contentView = LayoutInflater.from(context).inflate(R.layout.dialog_content, null, false);

        TextView titleMessage = (TextView) contentView.findViewById(R.id.title_message);
        titleMessage.setText(theMessage);
    }
}

在该方法的参数中传递上下文然后使用它 “(LayoutInflater) mActivity.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);

private void setContentMessage(String theMessage, Activity mActivity)
{

LayoutInflater mInflater = (LayoutInflater)
                mActivity.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);

    View contentView = mInflater.inflate(R.layout.dialog_content, null, false);

    TextView titleMessage = (TextView) contentView.findViewById(R.id.title_message);
    titleMessage.setText(theMessage);
}

这样使用:

LayoutInflater inflater = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View contentView = inflater.inflate(R.layout.dialog_content, null,false);

LayoutInflater inflater = LayoutInflater.from(getApplicationContext);
View contentView = inflater.inflate(R.layout.dialog_content, null,false);

更新日期:

像这样做一些改变

setContentMessage(message);context 作为参数传递。

所以改成这样

setContentMessage(message, context);

并更改它。

private void setContentMessage(String theMessage,Context context)
    {

        View contentView = contxet.getLayoutInflater().inflate(R.layout.dialog_content, null);

        TextView titleMessage = (TextView) contentView.findViewById(R.id.title_message);
        titleMessage.setText(theMessage);
    }

根据我从您的代码中了解到的情况,您正在创建一个带有自定义视图的对话框,然后您想要在该对话框内的某个文本视图中设置一条消息。

我看到你也使用了 holder,所以不用调用 setContentMessage(message),这是多余的,你可以这样

Holder holder;
holder = new ViewHolder(R.layout.dialog_content);
holder.titleMessage = message

在 Holder 实现中,您应该有一个指向标题 textView 的字段(无论如何,holder 模式应该是这样的)。