Java 为什么来自AlertDialog的输入不显示在RecyclerView中?

Java 为什么来自AlertDialog的输入不显示在RecyclerView中?,java,android,android-recyclerview,android-alertdialog,Java,Android,Android Recyclerview,Android Alertdialog,我想从AlertDialog对话框中获取输入,并将其设置为2个变量,然后使用这些变量作为参数,使用recyclerview创建列表 当代码处于该状态时,它会弹出对话框,当我输入信息并按“添加”时,屏幕上不会显示任何内容 这是我的Java文件: public class tab1Expenses extends Fragment { List<ExRow> expenseList = new ArrayList<>(); RecyclerView recyclerView;

我想从AlertDialog对话框中获取输入,并将其设置为2个变量,然后使用这些变量作为参数,使用recyclerview创建列表

当代码处于该状态时,它会弹出对话框,当我输入信息并按“添加”时,屏幕上不会显示任何内容

这是我的Java文件:

public class tab1Expenses extends Fragment {
List<ExRow> expenseList = new ArrayList<>();
RecyclerView recyclerView;
ExpensesAdapter mAdapter;
Button btnEx;
EditText txtExName;
EditText txtExAmount;

public void expenseData() {

    ExRow exs = new ExRow(txtExNa, txtExAm);
    expenseList.add(exs);

    mAdapter.notifyDataSetChanged();

}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    final View rootView = inflater.inflate(R.layout.tab1expense, container, false);
    btnEx = (Button) rootView.findViewById(R.id.btnEx);
    recyclerView = (RecyclerView) rootView.findViewById(R.id.recycler_view);

    mAdapter = new ExpensesAdapter(expenseList);
    RecyclerView.LayoutManager mLayoutManager = new RecyclerView.LayoutManager() {
        @Override
        public RecyclerView.LayoutParams generateDefaultLayoutParams() {

            return null;
        }

    };
    recyclerView.setLayoutManager(mLayoutManager);
    recyclerView.setItemAnimator(new DefaultItemAnimator());
    recyclerView.setAdapter(mAdapter);

    btnEx.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {

            View view = LayoutInflater.from(tab1Expenses.this.getActivity())
                    .inflate(R.layout.add_ex, null);
            txtExName = (EditText) view.findViewById(R.id.exName);
            txtExAmount = (EditText) view.findViewById(R.id.exAmount);
            AlertDialog.Builder add = new AlertDialog.Builder(tab1Expenses.this.getActivity());
                    add.setCancelable(true)
                    .setTitle("Enter Expense:")
                    .setView(view)
                    .setPositiveButton("Add",
                            new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    expenseData();
                                }
                            });
            Dialog dialog = add.create();
            dialog.show();
        }
    });

    return rootView;
   }
}
public类tab1Expenses扩展片段{
List expenseList=new ArrayList();
回收视图回收视图;
费用支出支出支出;
按钮btnEx;
编辑文本txtExName;
EditText txtExAmount;
公共支出数据(){
ExRow exs=新ExRow(txtExNa,txtExAm);
expenseList.add(exs);
mAdapter.notifyDataSetChanged();
}
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
最终视图根视图=充气机。充气(R.layout.tab1expense,容器,错误);
btnEx=(按钮)rootView.findviewbyd(R.id.btnEx);
recyclerView=(recyclerView)rootView.findviewbyd(R.id.recycler\u视图);
mAdapter=新支出调整器(支出列表);
RecyclerView.LayoutManager mLayoutManager=新建RecyclerView.LayoutManager(){
@凌驾
public RecyclerView.LayoutParams GeneratedDefaultLayoutParams(){
返回null;
}
};
recyclerView.setLayoutManager(mLayoutManager);
setItemAnimator(新的DefaultItemAnimator());
recyclerView.setAdapter(mAdapter);
btnEx.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
View=LayoutInflater.from(tab1Expenses.this.getActivity())
.充气(R.layout.add_ex,空);
txtExName=(EditText)view.findViewById(R.id.exName);
txtExAmount=(EditText)view.findviewbyd(R.id.exAmount);
AlertDialog.Builder add=新建AlertDialog.Builder(tab1Expenses.this.getActivity());
add.setCancelable(true)
.setTitle(“输入费用:”)
.setView(视图)
.setPositiveButton(“添加”,
新建DialogInterface.OnClickListener(){
@凌驾
public void onClick(DialogInterface dialog,int which){
expenseData();
}
});
Dialog=add.create();
dialog.show();
}
});
返回rootView;
}
}

以下是相关的XML文件:

<Button
    android:text="Add Expense"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/btnEx"
    android:layout_alignParentBottom="true"
    android:layout_centerHorizontal="true"
    android:width="800dp"
    android:textAppearance="@style/TextAppearance.AppCompat.Widget.Switch"
    android:background="@android:color/black"
    android:textColor="@android:color/holo_green_light"
    android:textColorLink="@android:color/holo_green_light" />

<ScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_alignParentBottom="true"
    android:layout_alignParentStart="true"
    android:layout_marginBottom="17dp">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" >

        <android.support.v7.widget.RecyclerView
            android:id="@+id/recycler_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:scrollbars="vertical" />

    </LinearLayout>

</ScrollView>


以及用于添加输入的XML文件:

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/background_light">

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="textPersonName"
        android:ems="10"
        android:id="@+id/exName"
        android:textColorLink="@android:color/holo_green_light"
        android:textColorHighlight="@android:color/holo_green_light"
        android:editable="false"
        android:hint="Expense Name" />

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="numberDecimal"
        android:ems="10"
        android:id="@+id/exAmount"
        android:textColorLink="@android:color/holo_green_light"
        android:textColorHighlight="@android:color/holo_green_light"
        android:hint="Expense Amount" />

</LinearLayout>

好的,我可以看到问题是因为它无法找到名为
txtExName
EditText
txtExAmount
。所以

切断这两条线:

recyclerView = (RecyclerView) rootView.findViewById(R.id.recycler_view);
txtExName = (EditText) rootView.findViewById(R.id.exName); //<---This one
txtExAmount = (EditText) rootView.findViewById(R.id.exAmount); // <--And this one

希望对您有所帮助。

您的XML文件中的编辑文本发布在哪里

可能它返回null,因为它找不到任何EditText:

String txtExNa = (txtExAmount.getText()).toString(); //here is crash, i think

对不起我的英语,我希望这有帮助

您需要从
视图
而非
根视图
获取
txtExName
txtExAmount
的参考。因此,从最新代码中删除这些行

txtExName = (EditText) rootView.findViewById(R.id.exName); 
txtExAmount = (EditText) rootView.findViewById(R.id.exAmount); 
把这些线加在同一点上

txtExName = (EditText) view.findViewById(R.id.exName); 
txtExAmount = (EditText) view.findViewById(R.id.exAmount); 

好的,这可能是最后的答案。我会尽力掩盖你想做的一切

//这是
tab1expense.xml
(不带工具栏)

//现在有一个名为
ExRow.java

public class ExRow{

    String str_txtExNa,str_txtExAm;

    ExRow(String str_txtExNa, String str_txtExAm){
        this.str_txtExNa=str_txtExNa;
        this.str_txtExAm=str_txtExAm;
    }

    public String getNa()
    {
       return str_txtExNa;
    }

    public String getAm()
    {
      return str_txtExAm;
    }
}
public class tab1Expenses extends Fragment {

    ArrayList<ExRow> expenseList = new ArrayList<>();
    RecyclerView recyclerView;
    ExpensesAdapter mAdapter;
    Button btnEx;
    EditText txtExName;
    EditText txtExAmount;

    public void expenseData(String txtExNa,String txtExAm) {
        ExRow exs = new ExRow(txtExNa, txtExAm);
        expenseList.add(exs);
        mAdapter.notifyDataSetChanged();
    }

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    final View rootView = inflater.inflate(R.layout.tab1expense, container, false);
    btnEx = (Button) rootView.findViewById(R.id.btnEx);
    recyclerView = (RecyclerView) rootView.findViewById(R.id.recycler_view);

    mAdapter = new ExpensesAdapter(expenseList);
    recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
    recyclerView.setItemAnimator(new DefaultItemAnimator());
    recyclerView.setAdapter(mAdapter);

    btnEx.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {

            View view = LayoutInflater.from(tab1Expenses.this.getActivity())
                    .inflate(R.layout.add_ex, null);
            txtExName = (EditText) view.findViewById(R.id.exName);
            txtExAmount = (EditText) view.findViewById(R.id.exAmount);
            AlertDialog.Builder add = new AlertDialog.Builder(tab1Expenses.this.getActivity());
                    add.setCancelable(true)
                    .setTitle("Enter Expense:")
                    .setView(view)
                    .setPositiveButton("Add",
                            new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    expenseData(txtExName.getText().toString(),txtExAmount`enter code here`.getText().toString() );
                                }
                            });
            Dialog dialog = add.create();
            dialog.show();
        }
    });

    return rootView;
   }
}
public class ExpensesAdapter extends RecyclerView.Adapter<ExpensesAdapter.ViewHolder> {

    private ArrayList<ExRow> expenseList;

    // Constructor of the class
    public ExpensesAdapter(ArrayList<ExRow> expenseList) {
        this.expenseList = expenseList;
    }

    // get the size of the list
    @Override
    public int getItemCount() {
        return expenseList == null ? 0 : expenseList.size();
    }


    // specify the row layout file
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_item_view, parent, false);
        ViewHolder myViewHolder = new ViewHolder(view);
        return myViewHolder;
    }

    // load data in each row element
    @Override
    public void onBindViewHolder(final ViewHolder holder, final int listPosition) {
        holder.row_name.setText(expenseList.get(listPosition).getNa());
        holder.row_amount.setText(expenseList.get(listPosition).getAm());
    }

    // Static inner class to initialize the views of rows
    static class ViewHolder extends RecyclerView.ViewHolder{
        public TextView row_name,row_amount;
        public ViewHolder(View itemView) {
            super(itemView);
            row_name = (TextView) itemView.findViewById(R.id.row_name);
            row_amount = (TextView) itemView.findViewById(R.id.row_amount);
        }
    }
}
//现在,您的
选项卡1 expenses.java

public class ExRow{

    String str_txtExNa,str_txtExAm;

    ExRow(String str_txtExNa, String str_txtExAm){
        this.str_txtExNa=str_txtExNa;
        this.str_txtExAm=str_txtExAm;
    }

    public String getNa()
    {
       return str_txtExNa;
    }

    public String getAm()
    {
      return str_txtExAm;
    }
}
public class tab1Expenses extends Fragment {

    ArrayList<ExRow> expenseList = new ArrayList<>();
    RecyclerView recyclerView;
    ExpensesAdapter mAdapter;
    Button btnEx;
    EditText txtExName;
    EditText txtExAmount;

    public void expenseData(String txtExNa,String txtExAm) {
        ExRow exs = new ExRow(txtExNa, txtExAm);
        expenseList.add(exs);
        mAdapter.notifyDataSetChanged();
    }

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    final View rootView = inflater.inflate(R.layout.tab1expense, container, false);
    btnEx = (Button) rootView.findViewById(R.id.btnEx);
    recyclerView = (RecyclerView) rootView.findViewById(R.id.recycler_view);

    mAdapter = new ExpensesAdapter(expenseList);
    recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
    recyclerView.setItemAnimator(new DefaultItemAnimator());
    recyclerView.setAdapter(mAdapter);

    btnEx.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {

            View view = LayoutInflater.from(tab1Expenses.this.getActivity())
                    .inflate(R.layout.add_ex, null);
            txtExName = (EditText) view.findViewById(R.id.exName);
            txtExAmount = (EditText) view.findViewById(R.id.exAmount);
            AlertDialog.Builder add = new AlertDialog.Builder(tab1Expenses.this.getActivity());
                    add.setCancelable(true)
                    .setTitle("Enter Expense:")
                    .setView(view)
                    .setPositiveButton("Add",
                            new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    expenseData(txtExName.getText().toString(),txtExAmount`enter code here`.getText().toString() );
                                }
                            });
            Dialog dialog = add.create();
            dialog.show();
        }
    });

    return rootView;
   }
}
public class ExpensesAdapter extends RecyclerView.Adapter<ExpensesAdapter.ViewHolder> {

    private ArrayList<ExRow> expenseList;

    // Constructor of the class
    public ExpensesAdapter(ArrayList<ExRow> expenseList) {
        this.expenseList = expenseList;
    }

    // get the size of the list
    @Override
    public int getItemCount() {
        return expenseList == null ? 0 : expenseList.size();
    }


    // specify the row layout file
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_item_view, parent, false);
        ViewHolder myViewHolder = new ViewHolder(view);
        return myViewHolder;
    }

    // load data in each row element
    @Override
    public void onBindViewHolder(final ViewHolder holder, final int listPosition) {
        holder.row_name.setText(expenseList.get(listPosition).getNa());
        holder.row_amount.setText(expenseList.get(listPosition).getAm());
    }

    // Static inner class to initialize the views of rows
    static class ViewHolder extends RecyclerView.ViewHolder{
        public TextView row_name,row_amount;
        public ViewHolder(View itemView) {
            super(itemView);
            row_name = (TextView) itemView.findViewById(R.id.row_name);
            row_amount = (TextView) itemView.findViewById(R.id.row_amount);
        }
    }
}
//最后是适配器类,即,
ExpensesAdapter.java

public class ExRow{

    String str_txtExNa,str_txtExAm;

    ExRow(String str_txtExNa, String str_txtExAm){
        this.str_txtExNa=str_txtExNa;
        this.str_txtExAm=str_txtExAm;
    }

    public String getNa()
    {
       return str_txtExNa;
    }

    public String getAm()
    {
      return str_txtExAm;
    }
}
public class tab1Expenses extends Fragment {

    ArrayList<ExRow> expenseList = new ArrayList<>();
    RecyclerView recyclerView;
    ExpensesAdapter mAdapter;
    Button btnEx;
    EditText txtExName;
    EditText txtExAmount;

    public void expenseData(String txtExNa,String txtExAm) {
        ExRow exs = new ExRow(txtExNa, txtExAm);
        expenseList.add(exs);
        mAdapter.notifyDataSetChanged();
    }

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    final View rootView = inflater.inflate(R.layout.tab1expense, container, false);
    btnEx = (Button) rootView.findViewById(R.id.btnEx);
    recyclerView = (RecyclerView) rootView.findViewById(R.id.recycler_view);

    mAdapter = new ExpensesAdapter(expenseList);
    recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
    recyclerView.setItemAnimator(new DefaultItemAnimator());
    recyclerView.setAdapter(mAdapter);

    btnEx.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {

            View view = LayoutInflater.from(tab1Expenses.this.getActivity())
                    .inflate(R.layout.add_ex, null);
            txtExName = (EditText) view.findViewById(R.id.exName);
            txtExAmount = (EditText) view.findViewById(R.id.exAmount);
            AlertDialog.Builder add = new AlertDialog.Builder(tab1Expenses.this.getActivity());
                    add.setCancelable(true)
                    .setTitle("Enter Expense:")
                    .setView(view)
                    .setPositiveButton("Add",
                            new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    expenseData(txtExName.getText().toString(),txtExAmount`enter code here`.getText().toString() );
                                }
                            });
            Dialog dialog = add.create();
            dialog.show();
        }
    });

    return rootView;
   }
}
public class ExpensesAdapter extends RecyclerView.Adapter<ExpensesAdapter.ViewHolder> {

    private ArrayList<ExRow> expenseList;

    // Constructor of the class
    public ExpensesAdapter(ArrayList<ExRow> expenseList) {
        this.expenseList = expenseList;
    }

    // get the size of the list
    @Override
    public int getItemCount() {
        return expenseList == null ? 0 : expenseList.size();
    }


    // specify the row layout file
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_item_view, parent, false);
        ViewHolder myViewHolder = new ViewHolder(view);
        return myViewHolder;
    }

    // load data in each row element
    @Override
    public void onBindViewHolder(final ViewHolder holder, final int listPosition) {
        holder.row_name.setText(expenseList.get(listPosition).getNa());
        holder.row_amount.setText(expenseList.get(listPosition).getAm());
    }

    // Static inner class to initialize the views of rows
    static class ViewHolder extends RecyclerView.ViewHolder{
        public TextView row_name,row_amount;
        public ViewHolder(View itemView) {
            super(itemView);
            row_name = (TextView) itemView.findViewById(R.id.row_name);
            row_amount = (TextView) itemView.findViewById(R.id.row_amount);
        }
    }
}
公共类ExpensesAdapter扩展了RecyclerView.Adapter{
私人ArrayList expenseList;
//类的构造函数
公共支出报表(ArrayList expenseList){
this.expenseList=expenseList;
}
//获取列表的大小
@凌驾
public int getItemCount(){
return expenseList==null?0:expenseList.size();
}
//指定行布局文件
@凌驾
public ViewHolder onCreateViewHolder(视图组父级,int-viewType){
View View=LayoutFlater.from(parent.getContext()).flate(R.layout.row\u item\u视图,parent,false);
ViewHolder myViewHolder=新的ViewHolder(视图);
返回myViewHolder;
}
//在每个行元素中加载数据
@凌驾
public void onBindViewHolder(最终视图持有人,最终整型列表位置){
holder.row_name.setText(expenseList.get(listPosition.getNa());
holder.row_amount.setText(expenseList.get(listPosition.getAm());
}
//用于初始化行视图的静态内部类
静态类ViewHolder扩展了RecyclerView.ViewHolder{
公共文本查看行名称、行金额;
公共视图持有者(视图项视图){
超级(项目视图);
row_name=(TextView)itemView.findViewById(R.id.row_name);
行金额=(TextView)itemView.findViewById(R.id.row金额);
}
}
}

希望这最终能解决问题。

您声明应用程序崩溃。请编辑您的问题,以包含此类崩溃的整个错误和堆栈跟踪。它将帮助人们给你提供好的答案。你能添加日志堆栈跟踪吗?然后,也许我们可以帮助.java.lang.NullPointerException:尝试在com.example.ojemz.expensetracker.tab1Expenses.expenseData(tab1Expenses.java:34)上的空对象引用上调用虚拟方法“android.text.Editable android.widget.EditText.getText()在com.example.ojemz.expensetracker.tab1Expenses$2$1.onClick(tab1Expenses.java:81)txtExNa=(txtExName.getText()).toString();哦,对不起,我没有包括在内。让我更新一下问题谢谢。应用程序不再因输入而崩溃,但不会再崩溃