2017-12-31 197 views
1

私はダイアログの助けを借りて新しいクライアントを追加しようとしていますが、私の編集テキストが存在しないようです。AlertDialogの助けを借りてカスタムアレイアダプタに新しいオブジェクトを追加

すべての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(); 

、誰もが何が悪かったのか説明できますか?

MainActivity.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_add_new_client.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> 

答えて

0

移動このコード:

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を割り当てると、ダイアログカスタムビューはまだ膨張していないので、すべてnullです。また、警告ダイアログではなく、膨らんだビューでfindViewByIdに電話する必要があります。

カスタムレイアウトを設定するだけで終わりにしながら、呼び出すことによって、あなたのtextviewsの初期化後、show()を呼び出さないでください:

alertDialog.show(); 

EDIT

はのグローバルフィールドとしてあなたEditTextsを宣言あなたの活動は、最終的なものである必要はありません。要約

、あなたの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(); 
} 

UPDATE あなたは警告ダイアログに膨張したビューにfindViewByIdを呼び出していないする必要があります。私が更新したコードを確認してください。

+0

ありがとうございますが、以前の場所で前のエラーが発生しました。 –

+0

あなたはそうです、ごめんなさい。膨張したビューでは 'findViewById'を呼び出す必要があり、警告ダイアログでは呼び出さないといけません。私が更新したコードを確認してください。 –

0

だけthis-前に、あなたのダイアログのレイアウトを追加します。

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(); 

    } 
} 

あなたはedittextsを初期化まずレイアウトコンテンツを追加する必要があります。

+0

ありがとうございますが、前の場所に前のエラーがあります。 –

関連する問題