2017-02-18 19 views
0

我正在Android Studio創建一個健身房應用程序,我試圖實現的第一個功能是讓用戶通過單擊操作欄中的某個選項來創建鍛鍊以添加它。點擊此按鈕會彈出一個警告對話框,其中帶有一個EditText字段以輸入鍛鍊名稱。稍後,我將使用輸入創建一個列表視圖,其中添加了不同的鍛鍊,但現在我只關心從EditText字段捕獲輸入。從操作欄菜單項捕獲用戶輸入

這是應該發生什麼..在this screen我點擊+按鈕,它帶出一個帶有EditText字段的警告對話框。我想在java主要活動文件中捕獲這個input

這裏是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); 
     } 
    } 
    } 

這裏是我的動作條菜單項XML用於添加鍛鍊名稱(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> 

末,該XML的EditText上(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>  

當我調試我的代碼時,如果我在EditText字段中輸入鍛鍊名稱,m_Text變量總是空的。我一直堅持這幾天,我已經梳理youtube,所以作爲答案,並沒有發現與我的問題很多有關。 任何有識之士,非常感謝。謝謝。

編輯:更新了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); 
    } 
    } 
} 

******最後編輯******* 因爲我已經完成了整個應用程序,我想我會後我的警告對話框代碼的情況下,它可以幫助別人了。事實證明,這個問題與警告對話是唯一的主要問題,一旦我習慣了android工作室和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

因此,所有我能看到的是你的方法是布爾和你正確地做了的EditText,但沒有回報反對。 – user7568042

+0

您需要創建自己的自定義偵聽器來處理點擊! – Eenvincible

回答

1

這裏是你應該怎麼做這個:

創建一個客戶點擊收聽

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

你應該讓mAddWorkout值類級別的,所以你可以很容易地訪問它!

然後:

設置此點擊收聽到您的對話框這樣

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變量。我將自定義偵聽器設置爲對話框。但是現在,當我調試代碼時,我陷入了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(); 

希望凡在你的代碼說你是從m_text檢索數據,這能解決你的問題