我正在编写一个应用程序,用户可以在其中从 NumberPicker
中选择一个数字(例如 2)。然后,创建一定数量的 EditTexts
(在本例中为 2)并分别添加到 TableRows
,然后将其添加到 TableLayout
,其中最终成为一列 EditTexts
,用户可以选择在其中输入自己的姓名。
单击按钮时,我想将名称(如果他们输入了名称)编译到 ArrayList 中,并将 ArrayList 传递到下一个 Activity。
但是当我使用 editText.getText().toString().trim()
NullPointerException
谁能告诉我原因或如何解决?我是 Java 新手,所以我的编码可能很糟糕......
package com.bowman.chalkone.app;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.NumberPicker;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;
import java.util.ArrayList;
public class SecondaryFragment extends Fragment implements NumberPicker.OnValueChangeListener, View.OnClickListener {
Button backBtn, nextBtn;
TableLayout tableLayout;
NumberPicker numPicker;
Integer numPlayers;
public SecondaryFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View v = inflater.inflate(R.layout.fragment_secondary, container, false);
//find buttons and set onclicklistener
backBtn = (Button) v.findViewById(R.id.backBtn);
nextBtn = (Button) v.findViewById(R.id.nextBtn);
//what happens when the "back" button is clicked
backBtn.setOnClickListener(this);
//what happens when the "next" button is clicked
nextBtn.setOnClickListener(this);
//find numberpicker and set onvaluechangedlistener
numPicker = (NumberPicker) v.findViewById(R.id.numberPicker);
numPicker.setOnValueChangedListener(this);
//set min & max
numPicker.setMinValue(2);
numPicker.setMaxValue(12);
//find tablelayout
tableLayout = (TableLayout) v.findViewById(R.id.midTblLyt);
//allow second column to stretch (the editText fields)
tableLayout.setColumnStretchable(1, true);
//reset "name" fields to default of two
addPlayerNames(numPicker.getMinValue());
return v;
}
private ArrayList<String> getPlayerNames() {
//create new ArrayList to store player names
ArrayList<String> playerArray = new ArrayList<String>();
//number of players added used as player number if no name
Integer playersAdded = 0;
for (int i = 0, c = tableLayout.getChildCount(); i < c; i++) {
TableRow tableRow = (TableRow) tableLayout.getChildAt(i);
for (int j = 0, d = tableRow.getChildCount(); j < d; j++) {
Error -> EditText editText = (EditText) tableRow.getChildAt(d);
String name = editText.getText().toString().trim();
//increment playersAdded (because adding will happen)
playersAdded++;
//check if "name" is empty
if (TextUtils.isEmpty(name)) {
//since it is, add default "Player #"
playerArray.add("Player " + playersAdded);
} else {
//since it is not, add "name"
playerArray.add(name);
}
}
}
return playerArray;
}
public static SecondaryFragment newInstance() {
//create new fragment
SecondaryFragment f = new SecondaryFragment();
return f;
}
@Override
public void onValueChange(NumberPicker numberPicker, int i, int i2) {
//add the required "name" fields
addPlayerNames(i2);
}
private void addPlayerNames(Integer players) {
//initiate variables
int itter = 0;
numPlayers = players;
//clear everything out of tableLayout in case of previous population
tableLayout.removeAllViewsInLayout();
//populate tableLayout with labels and textedits
while (itter < numPlayers) {
//increment itter
itter++;
//initialize elements
TableRow tableRow = new TableRow(getActivity().getApplicationContext());
tableRow.setBottom(10);
TextView textView = new TextView(getActivity().getApplicationContext());
textView.setTextSize(20);
textView.setPadding(0, 10, 0, 0);
textView.setRight(5);
textView.setText("Player " + itter + ":");
EditText editText = new EditText(getActivity().getApplicationContext());
//add textView and editText to tableRow
tableRow.addView(textView, 0);
tableRow.addView(editText, 1);
//add tableRow to tableLayout
tableLayout.addView(tableRow);
}
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.backBtn: {
//go to PrimaryFragment page
MainActivity.pager.setCurrentItem(0);
//reset numberpicker to default minvalue
numPicker.setValue(numPicker.getMinValue());
//reset default number of "name" fields
addPlayerNames(numPicker.getMinValue());
}
break;
case R.id.nextBtn: {
Error -> ArrayList < String > playerArray = getPlayerNames();
//start ScoreActivity
Intent intent = new Intent(getActivity().getApplicationContext(), ScoreActivity.class);
intent.putStringArrayListExtra("arrayList", playerArray);
startActivity(intent);
}
break;
}
}
}
Logcat 输出:
06-07 14:49:15.026 14181-14181/com.bowman.chalkone.app D/AndroidRuntime﹕ Shutting down VM 06-07 14:49:15.026 14181-14181/com.bowman.chalkone.app W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0x4163ace0) 06-07 14:49:15.028 14181-14181/com.bowman.chalkone.app E/AndroidRuntime﹕ FATAL EXCEPTION: main Process: com.bowman.chalkone.app, PID: 14181 java.lang.NullPointerException at com.bowman.chalkone.app.SecondaryFragment.getPlayerNames(SecondaryFragment.java:82) at com.bowman.chalkone.app.SecondaryFragment.onClick(SecondaryFragment.java:172) at android.view.View.performClick(View.java:4445) at android.view.View$PerformClick.run(View.java:18446) at android.os.Handler.handleCallback(Handler.java:733) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:136) at android.app.ActivityThread.main(ActivityThread.java:5144) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:611) at dalvik.system.NativeStart.main(Native Method) 06-07 14:49:16.825 14181-14181/com.bowman.chalkone.app I/Process﹕ Sending signal. PID: 14181 SIG: 9
最佳答案
tr.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
TableRow t = (TableRow) v;
EditText firstText = (EditText ) t.getChildAt(position of edittext in table row);
String sCode = firstText.getText().toString();
Log.v("Inserted---->", sCode );
}
});
关于java - 单击时,从 TableLayout 中动态创建的 EditText 获取用户输入的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24100375/