代码之家  ›  专栏  ›  技术社区  ›  Wlad Guz

借助AlertDialog向自定义阵列适配器添加新对象

  •  1
  • Wlad Guz  · 技术社区  · 8 年前

    我试图在dialog的帮助下添加新客户端,但我的编辑文本似乎不存在。

    看起来所有ID都是正确的,活动生命周期一切正常,但我得到:

    java.lang.NullPointerException: Attempt to invoke virtual method 'android.text.Editable android.widget.EditText.getText()' on a null object reference at dartdev.intent.MainActivity$3.onClick(MainActivity.java:122)
    

    在线:

         String nameValue = clientName.getText().toString().trim();
    

    有人能解释出哪里出了问题吗?

    主要活动。Java语言

    public class MainActivity extends Activity{
    
        ArrayList<Client> clientListItems = new ArrayList<Client>();
        ClientAdapter clientAdapter;
    
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main_layout);
    
            initClients();
    
            clientAdapter = new ClientAdapter(this, clientListItems);
            ListView listView = (ListView) findViewById(R.id.listView);
            listView.setAdapter(clientAdapter);
    
            Button buttonView = (Button)findViewById(R.id.addListItem);
    
            buttonView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
    
                    setAddingDialog();
    
                }
            });
    
    
    
        }
    
        /*
        @Override
        protected void onStart() {
            super.onStart();
            Button buttonView = (Button)findViewById(R.id.addListItem);
    
            buttonView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
    
                    //listItems.add(0, Utils.hashGenerator(25));
                    //adapter.notifyDataSetChanged();
    
                    //DialogFragment newFragment = new AddingDialog();
                    //newFragment.show(getFragmentManager(), "adding");
                    setAddingDialog();
    
                }
            });
        }
        */
    
        void initClients(){
            clientListItems.add(new Client("alex", 1265, new Wallet("151516456464564654", 4564.56), R.drawable.ic_launcher_foreground));
            clientListItems.add(new Client("mike", 26, new Wallet("465456445644123231", 1645.2), R.drawable.ic_launcher_foreground));
            clientListItems.add(new Client("tray", 145, new Wallet("12315465489789", 0.00), R.drawable.ic_launcher_foreground));
            clientListItems.add(new Client("vincent", 999, new Wallet("3213546549789", 1000000.01), R.drawable.ic_launcher_foreground));
            clientListItems.add(new Client("venom", 666, new Wallet("321154654654798", 145.6), R.drawable.ic_launcher_foreground));
        }
    
        void setAddingDialog(){
    
            AlertDialog.Builder builder = new AlertDialog.Builder(this);
            LayoutInflater inflater = getLayoutInflater();
    
            Dialog alertDialog = builder.create();
    
            final EditText clientName = (EditText) alertDialog.findViewById(R.id.newClientName);
            final EditText clientId = (EditText) alertDialog.findViewById(R.id.newClientId);
            final EditText clientWallet = (EditText) alertDialog.findViewById(R.id.newClientWallet);
            final EditText clientBalance = (EditText) alertDialog.findViewById(R.id.newClientBalance);
    
            builder.setView(inflater.inflate(R.layout.dialog_add_new_client, null))
                    .setPositiveButton("add", new DialogInterface.OnClickListener(){
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {
                            String nameValue = clientName.getText().toString().trim();
                            int idValue = Integer.valueOf(clientId.getText().toString().trim());
                            String walletValue = clientWallet.getText().toString().trim();
                            double balanceValue = Double.valueOf(clientBalance.getText().toString().trim());
                            clientListItems.add(new Client(nameValue, idValue, new Wallet(walletValue, balanceValue), R.drawable.ic_launcher_foreground));
                        }
                    })
                    .setNegativeButton("cancel", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int id) {
                            dialog.dismiss();
                        }
                    })
                    .show();
    
        }
    }
    

    dialog\u add\u new\u客户端。xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical" android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <EditText
            android:id="@+id/newClientName"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="4dp"
            android:layout_marginLeft="4dp"
            android:layout_marginRight="4dp"
            android:layout_marginTop="16dp"
            android:hint="name"
            android:inputType="text" />
    
        <EditText
            android:id="@+id/newClientId"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="4dp"
            android:layout_marginLeft="4dp"
            android:layout_marginRight="4dp"
            android:layout_marginTop="16dp"
            android:hint="id"
            android:inputType="number" />
    
        <EditText
            android:id="@+id/newClientWallet"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="4dp"
            android:layout_marginLeft="4dp"
            android:layout_marginRight="4dp"
            android:layout_marginTop="16dp"
            android:hint="walletNumber"
            android:inputType="text" />
    
        <EditText
            android:id="@+id/newClientBalance"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="4dp"
            android:layout_marginLeft="4dp"
            android:layout_marginRight="4dp"
            android:layout_marginTop="16dp"
            android:hint="balance"
            android:inputType="numberDecimal" />
    
    </LinearLayout>
    
    2 回复  |  直到 8 年前
        1
  •  0
  •   Roberto Martucci    8 年前

    移动此代码:

     Dialog alertDialog = builder.create();
    
     final EditText clientName = (EditText) alertDialog.findViewById(R.id.newClientName);
     final EditText clientId = (EditText) alertDialog.findViewById(R.id.newClientId);
     final EditText clientWallet = (EditText) alertDialog.findViewById(R.id.newClientWallet);
     final EditText clientBalance = (EditText) alertDialog.findViewById(R.id.newClientBalance);
    

    之后

    builder.setView(inflater.inflate(R.layout.dialog_add_new_client, null))
                .setPositiveButton("add", new DialogInterface.OnClickListener(){
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        String nameValue = clientName.getText().toString().trim();
                        int idValue = Integer.valueOf(clientId.getText().toString().trim());
                        String walletValue = clientWallet.getText().toString().trim();
                        double balanceValue = Double.valueOf(clientBalance.getText().toString().trim());
                        clientListItems.add(new Client(nameValue, idValue, new Wallet(walletValue, balanceValue), R.drawable.ic_launcher_foreground));
                    }
                })
                .setNegativeButton("cancel", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        dialog.dismiss();
                    }
                });
    

    分配EditText时,对话框自定义视图尚未膨胀,因此它们都为空。你也需要打电话 findViewById 在充气视图上,而不是在警报对话框上。

    不要打电话 show() 当您设置自定义布局时,但仅在最后,在textviews初始化后,通过调用:

    alertDialog.show();
    

    编辑

    将EditText声明为活动的全局字段,这样它们就不必是最终字段。

    总结一下,改变你的 setAddingDialog() 这种方式:

    private EditText clientName;
    private EditText clientId;
    private EditText clientWallet;
    private EditText clientBalance;
    
    void setAddingDialog(){
    
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        LayoutInflater inflater = getLayoutInflater();
    
        View dialogView = inflater.inflate(R.layout.dialog_add_new_client, null);
        builder.setView(dialogView)
               .setPositiveButton("add", new DialogInterface.OnClickListener(){
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        String nameValue = clientName.getText().toString().trim();
                        int idValue = Integer.valueOf(clientId.getText().toString().trim());
                        String walletValue = clientWallet.getText().toString().trim();
                        double balanceValue = Double.valueOf(clientBalance.getText().toString().trim());
                        clientListItems.add(new Client(nameValue, idValue, new Wallet(walletValue, balanceValue), R.drawable.ic_launcher_foreground));
                    }
                })
               .setNegativeButton("cancel", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        dialog.dismiss();
                    }
                });
    
        Dialog alertDialog = builder.create();
    
        clientName = (EditText) dialogView.findViewById(R.id.newClientName);
        clientId = (EditText) dialogView.findViewById(R.id.newClientId);
        clientWallet = (EditText) dialogView.findViewById(R.id.newClientWallet);
        clientBalance = (EditText) dialogView.findViewById(R.id.newClientBalance);
    
        alertDialog.show();
    }
    

    更新 你需要打电话 findViewById 在充气视图上,而不是在警报对话框上。检查我更新的代码。

        2
  •  0
  •   Shivam Oberoi    8 年前

    只需在此之前添加对话框布局-:

    builder.setContentView(R.layout.dialog_add_new_client);
    
     final EditText clientName = (EditText) alertDialog.findViewById(R.id.newClientName);
            final EditText clientId = (EditText) alertDialog.findViewById(R.id.newClientId);
            final EditText clientWallet = (EditText) alertDialog.findViewById(R.id.newClientWallet);
            final EditText clientBalance = (EditText) alertDialog.findViewById(R.id.newClientBalance);
    
            builder.setPositiveButton("add", new DialogInterface.OnClickListener(){
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {
                            String nameValue = clientName.getText().toString().trim();
                            int idValue = Integer.valueOf(clientId.getText().toString().trim());
                            String walletValue = clientWallet.getText().toString().trim();
                            double balanceValue = Double.valueOf(clientBalance.getText().toString().trim());
                            clientListItems.add(new Client(nameValue, idValue, new Wallet(walletValue, balanceValue), R.drawable.ic_launcher_foreground));
                        }
                    })
                    .setNegativeButton("cancel", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int id) {
                            dialog.dismiss();
                        }
                    })
                    .show();
    
        }
    }
    

    您需要先添加版面内容,然后初始化EditText。

    推荐文章