java - 单击时,从 TableLayout 中动态创建的 EditText 获取用户输入的文本

标签 java android android-edittext tablelayout tablerow

我正在编写一个应用程序,用户可以在其中从 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/

相关文章:

Java 用 Flying Saucer 生成 PDF

java - 为什么可以使用 map.vaules 上的迭代器来移除 HashMap#Entry?

java - Spring Boot 与 H2 数据库自动创建

java - 需要java登录代码的帮助

Android PagerAdapter,获取当前位置

java - 调用 notifyDataSetChanged() 后丢失 EditText 值;

java - Android onFocusChange 和 onClickListener

android - 从设备获取 authorId - android

java - 在视频中看到了这一点,该视频被称为匿名内部类的替代品,这是什么?

android - 当 EditText 在 Android 中获得焦点时,TextView 停止水平滚动