2017-02-18 12 views
0

Android Studioでジムアプリを作成していますが、実装しようとしている最初の機能は、アクションバーのオプションをクリックして追加することでユーザーにトレーニングを作成させることです。このボタンをクリックすると、ワークアウト名を入力するためのEditTextフィールドがあるアラートダイアログが表示されます。後で、入力を使用して、異なるワークアウトが追加されたリストビューを作成しますが、今のところ、このEditTextフィールドからの入力をキャプチャすることが心配です。アクションバーメニューからのユーザー入力の取得

ここではどうなるのですか?this screen私は+ボタンをクリックすると、EditTextフィールドの警告ダイアログボックスが表示されます。私はこのinputをjavaのメインアクティビティファイルに取り込みたいと思います。

ここには、JavaのMainActivityファイルがあります。私はEditTextフィールドからの入力をm_Text変数に格納する必要があります。ここで

public class MainActivity extends AppCompatActivity { 

private String m_Text; 

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

} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.main_menu,menu); 
    return super.onCreateOptionsMenu(menu); 
} 

@Override 
//Clicking add workout button in the action bar 
//stackoverflow.com/questions/13143006/alert-dialog-from-within-onooptionsitemselected-android 
public boolean onOptionsItemSelected(MenuItem item) { 

    switch(item.getItemId()){ 
     case R.id.action_add_workout: 
      //final EditText mAddWorkout = (EditText)R.layout.userinput; 

      //Creating the dialog box for entering the workout name 
      AlertDialog.Builder builder = new AlertDialog.Builder(this); 
      builder.setTitle("Enter the workout name"); 

      //Create the user input xml file into a java object; capturing the user input from the dialog box 
      //inflate means "fill" 
      View view = LayoutInflater.from(this).inflate(R.layout.userinput,null); 
      final EditText mAddWorkout = (EditText)view.findViewById(R.id.workout_name_input); 

      builder.setView(R.layout.userinput); 
      builder.setPositiveButton("OK", new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        m_Text = mAddWorkout.getText().toString(); 
        boolean brkpt = true; 
       } 
      }); //Second parameter pass in which event listener should trigger when the button is clicked 
      builder.setNegativeButton("Cancel",null); 
      builder.show(); 

      return true; 

     default: 
      return super.onOptionsItemSelected(item); 
     } 
    } 
    } 

は、ワークアウトの名前を追加するための私のアクションバーのメニュー項目(main_menu.xml)

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto"> 
<item 
    android:id="@+id/action_add_workout" 
    android:icon="@drawable/ic_add" 
    android:title="@string/add_workout" 
    app:showAsAction="always"/> 
</menu> 

最終、のEditTextのためのXML(userinput.xml)

<EditText xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/workout_name_input" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:hint="name.."> 
</EditText>  
ためのXMLです

コードをデバッグするとき、EditTextフィールドにワークアウト名を入力すると、m_Text変数は常に空です。私はこれに数日間執着していました。私はYouTubeとSOを答えて梳きましたが、私の問題に関してはあまり見当たりませんでした。 洞察力があれば幸いです。ありがとうございました。

EDIT:MainActivityのコードが更新されました。私はカスタムクリッカーに制御を渡すことができますが、入力はまだ保存されません。おかげ

public class MainActivity extends AppCompatActivity { 

private EditText mAddWorkout; 

public class CustomClickListener implements View.OnClickListener { 

    private final Dialog dialog; 

    CustomClickListener(Dialog dialog) { 
     this.dialog = dialog; 
    } 

    @Override 
    public void onClick(View v) { 
     String editTextValue= mAddWorkout.getText().toString(); 
    } 
} 

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

} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.main_menu,menu); 
    return super.onCreateOptionsMenu(menu); 
} 

@Override 
//Clicking add workout button in the action bar 
public boolean onOptionsItemSelected(MenuItem item) { 

    switch(item.getItemId()){ 
     case R.id.action_add_workout: 
      //final EditText mAddWorkout = (EditText)R.layout.userinput; 

      //Creating the dialog box for entering the workout name 
      AlertDialog.Builder builder = new AlertDialog.Builder(this); 
      builder.setTitle("Enter the workout name"); 

      //Create the user input xml file into a java object; capturing the user input from the dialog box 
      //inflate means "fill" 
      View view = LayoutInflater.from(this).inflate(R.layout.userinput,null); 
      mAddWorkout = (EditText)view.findViewById(R.id.workout_name_input); 

      builder.setView(R.layout.userinput); 
      builder.setPositiveButton("OK",null); 
      builder.setNegativeButton("Cancel",null); 

      AlertDialog alertDialog = builder.create(); 
      alertDialog.show(); 
      Button saveWorkout = alertDialog.getButton(DialogInterface.BUTTON_POSITIVE); 
      saveWorkout.setOnClickListener(new CustomClickListener(alertDialog)); 
      builder.show(); 

      return true; 

     default: 
      return super.onOptionsItemSelected(item); 
    } 
    } 
} 

****** FINAL EDIT ******* 私は以来、全体のアプリを終了し、それが他の誰かを助け場合、私は私の警告ダイアログコードをポストだろうと思ってきました。私は、スタジオとJavaの事が本当に始まったアンドロイドに慣れれば、警告ダイアログでこの問題が私が持っていた唯一の大きな問題であることが判明しました。とにかく私のgymappは、私はジムでそれを実際に使用してきました...のトレーニング、演習、およびセットを追跡するためにSQLliteを使用していますちょっといいアプリです:)私の場合は

@Override 
//Clicking add workout button in the action bar 
public boolean onOptionsItemSelected(MenuItem item) { 

    //Creating the dialog box for entering the workout name 
    AlertDialog.Builder builder = new AlertDialog.Builder(this); 

    final EditText input = new EditText(this); 

    builder.setTitle("Enter the workout name").setView(input).setView(input); 

    builder.setPositiveButton("OK",new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      Workout workout = new Workout(input.getText().toString()); 
      long workout_key = myDb.createWorkout(workout); 
      populateWorkouts(); 
     } 
    }); 
    builder.setNegativeButton("Cancel",new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      dialog.cancel(); 
     } 
    }); 

    builder.show(); 

    return super.onOptionsItemSelected(item); 
} 

、私が作成した入力を使用しますワークアウトオブジェクトを作成し、データベースに挿入します。また、アクションバーメニューに複数のオプションがある場合は、switch文が必要になることは明らかです。

私を助けようとした2人のメンバーに感謝します。ここで

+0

を解きだからあなたのコードの中であなたがm_textからデータをretreivingていると言う場合は、私が見ることができるすべては、あなたの方法はbooleanですされていない、あなたは正しくのEditTextをしましたが、ノーリターンオブジェクトを戻す。 – user7568042

+0

クリックを処理するには、独自のカスタムリスナーを作成する必要があります。 – Eenvincible

答えて

1

は、あなたがこれを行う方法を次のとおりです。

は、あなたが簡単にアクセスできるようにあなたがmAddWorkout値クラスレベルにする必要があり、顧客のクリックリスナー

private class CustomClickListener implements View.OnClickListener { 

    private final Dialog dialog; 

    CustomClickListener(Dialog dialog) { 
     this.dialog = dialog; 
    } 

    @Override 
    public void onClick(View v) { 
     String editTextValue= mAddWorkout.getText().toString(); 
    } 
} 

を作成しよう!その後

:この

AlertDialog.Builder builder = new AlertDialog.Builder(this); 
     builder.setTitle("Enter the workout name"); 

     //Create the user input xml file into a java object; capturing the user input from the dialog box 
     //inflate means "fill" 
     View view = LayoutInflater.from(this).inflate(R.layout.userinput,null); 
     final EditText mAddWorkout = (EditText)view.findViewById(R.id.workout_name_input); 

     builder.setView(R.layout.userinput); 
     builder.setPositiveButton("OK", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 

       boolean brkpt = true; 
      } 
     }); //Second parameter pass in which event listener should trigger when the button is clicked 
     AlertDialog alertDialog = builder.create(); 
     alertDialog .show(); 
Button saveWorkout = alertDialog.getButton(DialogInterface.BUTTON_POSITIVE); 
    saveWorkout .setOnClickListener(new CustomClickListener(alertDialog)); 

のようなあなたのダイアログにこのクリックリスナーを設定し

は、これは私が自分自身のコードを使用してソリューションであり、正常に動作します。クリックリスナーのonClickメソッド内で検証を行い、それに応じてユーザーに警告することができます。

幸運を祈る!

+0

私を助ける時間をとってくれてありがとう。私はまだ問題があります。私は、mAddWorkoutメンバをMainActivityのプライベートメンバにし、その下にCustomClickListenerクラスを追加して、クラスがmAddWorkout変数を "見る"ことができるようにしました。カスタムリスナーをダイアログに設定しました。しかし、今私はコードをデバッグすると、私は "OK"ボタンのonClickの中にこだわって取得します。私のコードはあなたが投稿したように奇抜です。何か案は?? – jarrm5

+0

ダイアログを閉じる必要があります。それがコンストラクタの引数として渡された理由です – Eenvincible

+0

これが正しいと確信していますか?私は、CustomClickListener onClickイベントの中にブレークポイントを設定し、私がトレーニング名を入力して 'ok'を押すと、コントロールがそこに渡されることはありません – jarrm5

1
private android.app.AlertDialog mAlert; 
private EditText mAddWorkout; 

//Creating the dialog box for entering the workout name 
AlertDialog.Builder builder = new AlertDialog.Builder(this); 
View view = LayoutInflater.from(this).inflate(R.layout.userinput,null); 

builder.setTitle("Enter the workout name"); 
mAlert = builder.create(); 
mAlert.setCancelable(true); 
mAlert.setView(view, 10, 10, 10, 10); 
if (mAlert != null && !mAlert.isShowing()) { 
       mAlert.show(); 
      } 
mAddWorkout = (EditText) mAlert.findViewById(R.id.workout_name_input); 
m_Text = mAddWorkout.getText().toString(); 

・ホープこれはあなたの問題

関連する問題