2017-12-22 48 views
0

カスタムDialogFragmentとインターフェイスを使用してダイアログを作成し、クリックイベントをダイアログホスト(MainActivity)に戻すカスタムレイアウトを作成しました。しかし、私の問題は、ダイアログ内のEditTextに入力されたテキストを取得しようとすると、空の文字列として返されるということです。何か案は?私はTextViewのテキストをダイアログ内で取得できますが、EditTextではありません。ダイアログテキストビューからテキストを取得できますが、ダイアログボックスのテキストを取得できませんedittext

add_class_dialog.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:padding="10dp"> 
    <LinearLayout 
     android:orientation="horizontal" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:gravity="center"> 
     <TextView 
      android:id="@+id/viewClassName" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="Class: " 
      android:textSize="25sp" 
      android:textColor="@color/textColor"/> 
     <EditText 
      android:id="@+id/editClassName" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:hint="Enter class" 
      android:textSize="25sp" 
      android:textColor="@color/textColor" 
      android:layout_gravity="center"/> 
    </LinearLayout> 
</LinearLayout> 

MainActivity.java:

public class MainActivity extends FragmentActivity implements AddClassDialogFragment.AddClassDialogListener { 

TextView nameView; 
EditText editName; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    View vi = getLayoutInflater().inflate(R.layout.add_class_dialog, null); 
    nameView = vi.findViewById(R.id.viewClassName); 
    editName = vi.findViewById(R.id.editClassCredits); 

} 
public void addClass(View view) { 
    AddClassDialogFragment acdf = new AddClassDialogFragment(); 
    acdf.show(getFragmentManager(), "ac"); 
} 
@Override 
public void onDialogPositiveClick(DialogFragment dialog) { 
    Toast.makeText(this, nameView.getText().toString(), Toast.LENGTH_SHORT).show(); 
    Toast.makeText(this, editName.getText().toString(), Toast.LENGTH_SHORT).show(); 

} 
@Override 
public void onDialogNegativeClick(DialogFragment dialog) { 
    Toast.makeText(this, "Cancel", Toast.LENGTH_SHORT).show(); 
} 
} 

AddClassDialogFragment.java:

public class AddClassDialogFragment extends DialogFragment { 
public interface AddClassDialogListener { 
    void onDialogPositiveClick(DialogFragment dialog); 
    void onDialogNegativeClick(DialogFragment dialog); 
} 
AddClassDialogListener mListener; 

@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 
    try { 
     mListener = (AddClassDialogListener) activity; 
    } catch (ClassCastException e) { 
     throw new ClassCastException(activity.toString() + " must implement NoticeDialogListener"); 
    } 
} 

@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
    final LayoutInflater inflater = getActivity().getLayoutInflater(); 
    builder.setView(inflater.inflate(R.layout.add_class_dialog, null)); 
    builder.setPositiveButton("Add", new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialogInterface, int i) { 
      mListener.onDialogPositiveClick(AddClassDialogFragment.this); 
     } 
    }); 
    builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialogInterface, int i) { 
      mListener.onDialogNegativeClick(AddClassDialogFragment.this); 
     } 
    }); 
    return builder.create(); 
} 
} 
+2

間違ったIDをrefferingされ、** editClassName ** findViewById –

答えて

1

TextViewの価値は、レイアウトにハードコードされているためです。 android:text="Class: " コードにはいくつか問題があります。レイアウトがダイアログのレイアウトの場合は、アクティビティでそれを膨張させるべきではありません。ここにその実装方法を示します。 アクティビティでレイアウトを拡張する必要はありません。レイアウトはダイアログで膨らませて、アクティビティはそのレイアウトが何を持っているか知っていないはずです。アクティビティが何であれ、はコールバックを介して来るべきであることを知るためにが必要です。

DialogFragmentは、ここで宣言するインターフェイスを通じてアクティビティに戻る必要があるものを定義します。私はTextViewとEditTextを取るように変更しました。あなたの要件に応じて変更することができます。 builder.setView(inflater.inflate(R:

package com.soulpatch.stackoverflow; 

import android.app.Activity;  
import android.app.AlertDialog; 
import android.app.Dialog; 
import android.content.DialogInterface; 
import android.os.Bundle; 
import android.support.v4.app.DialogFragment; 
import android.view.LayoutInflater; 
import android.widget.EditText; 
import android.widget.LinearLayout; 
import android.widget.TextView; 

public class AddClassDialogFragment extends DialogFragment { 
public interface AddClassDialogListener { 
    void onDialogPositiveClick(TextView textView, EditText editText); 

    void onDialogNegativeClick(TextView textView, EditText editText); 
} 

AddClassDialogListener mListener; 

@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 
    try { 
     mListener = (AddClassDialogListener) activity; 
    } catch (ClassCastException e) { 
     throw new ClassCastException(activity.toString() + " must implement NoticeDialogListener"); 
    } 
} 

@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
    final LayoutInflater inflater = getActivity().getLayoutInflater(); 
    final LinearLayout linearLayout = (LinearLayout) inflater.inflate(R.layout.add_class_dialog, null); 
    final TextView textView = linearLayout.findViewById(R.id.viewClassName); 
    final EditText editText = linearLayout.findViewById(R.id.editClassName); 
    builder.setView(linearLayout); 
    builder.setPositiveButton("Add", new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialogInterface, int i) { 
      mListener.onDialogPositiveClick(textView, editText); 
     } 
    }); 
    builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialogInterface, int i) { 
      mListener.onDialogNegativeClick(textView, editText); 
     } 
    }); 
    return builder.create(); 
} 
} 
+0

が、私はラインを変化させることで、別々にそれを少し解い(と少しシンプルな)しながら、これを使用する必要があります.layout.add_class_dialog、null)); to: ビューdialogView = inflater.inflate(R.layout.add_class_dialog、null); builder.setView(dialogView); 次に、この宣言を使ってedittextデータにアクセスすることができました。 final EditText editClassName = dialogView.findViewById(R.id.editNameD); そして、onDialogPositiveClickメソッドの引数としてgetText()の値を入れます。 – 4rsenal

0

あなたは自分のEditTextのために間違ったIDを言及しました。

public class MainActivity extends FragmentActivity implements AddClassDialogFragment.AddClassDialogListener { 

TextView nameView; 
EditText editName; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    View vi = getLayoutInflater().inflate(R.layout.add_class_dialog, null); 
    nameView = vi.findViewById(R.id.viewClassName); 
    editName = vi.findViewById(R.id.editClassName); 

} 
public void addClass(View view) { 
    AddClassDialogFragment acdf = new AddClassDialogFragment(); 
    acdf.show(getFragmentManager(), "ac"); 
} 
@Override 
public void onDialogPositiveClick(DialogFragment dialog) { 
    Toast.makeText(this, nameView.getText().toString(), Toast.LENGTH_SHORT).show(); 
    Toast.makeText(this, editName.getText().toString(), Toast.LENGTH_SHORT).show(); 

} 
@Override 
public void onDialogNegativeClick(DialogFragment dialog) { 
    Toast.makeText(this, "Cancel", Toast.LENGTH_SHORT).show(); 
} 
} 
関連する問題