Java 为什么来自AlertDialog的输入不显示在RecyclerView中?
我想从AlertDialog对话框中获取输入,并将其设置为2个变量,然后使用这些变量作为参数,使用recyclerview创建列表 当代码处于该状态时,它会弹出对话框,当我输入信息并按“添加”时,屏幕上不会显示任何内容 这是我的Java文件: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;
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();哦,对不起,我没有包括在内。让我更新一下问题谢谢。应用程序不再因输入而崩溃,但不会再崩溃