2014-01-11 3 views
0

Цель этого кода:Слушатель реализация: 3 EditTexts в одном фрагменте

У меня есть макет фрагмента с 3 EditTexts:

  • Многоканальный Описание
  • десятичное количество
  • в Дата.

Я хочу, чтобы пользователь вводил эту информацию с помощью программной клавиатуры, а затем Fragment возвращал newItem (запись) в родительскую активность, чтобы ее можно было сохранить в db.

  1. Я принимаю правильный подход, используя прослушиватель?

    onEditorActionListener кажется более гибким, чем onKeyListener.

  2. Eclipse, на самом деле не устраивает линии:

    descriptionEditText.setOnEditorActionListener(this);

    жалуется, что setOnEditorActionListener не применяется с аргументами.

Я предполагаю, что это означает, что у меня есть проблема здесь:

public interface OnEditorActionListener { 
    public void onNewItemAdded(String[] newItem); 
    // need to change this newItem? 
} 

Другие комментарии приветствия, как это моя первая попытка попробовать это, и я уверен, что это ужасно.

Полный код ниже.

import android.app.Activity; 
import android.app.Fragment; 
import android.os.Bundle; 
import android.view.KeyEvent; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.view.inputmethod.EditorInfo; 
import android.widget.EditText; 
import android.widget.TextView; 

public class AddNewItemTextFragment extends Fragment { 

    // A Fragment event callback interface, pg 126 Meier; used to share info with host Activity 
    // Host activity listens for a new item to be created 

    public interface OnEditorActionListener { 
     public void onNewItemAdded(String[] newItem); 
     // need to change this newItem? 
    } 

    // Create a variable to store a reference to the parent Activity that will implement the interface. 

    private OnEditorActionListener onEditorActionListener; 

    // This reference can be retrieved as soon as the parent has been bound to the Fragment with the Fragment's onAttach handler. 

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

    // The Listener implementation 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstaceState) { 
     View view = inflater.inflate(R.layout.add_new_item_text_fragment , container, false); 

     final EditText descriptionEditText = (EditText)view.findViewById(R.id.description); 
     descriptionEditText.setOnEditorActionListener(this); 
     final EditText amountEditText = (EditText)view.findViewById(R.id.amount); 
     amountEditText.setOnEditorActionListener(this); 
     final EditText dateEditText = (EditText)view.findViewById(R.id.date1); 
     dateEditText.setOnEditorActionListener(this); 
     // add category, sub category Spinner 


     // need to add newItem as a parameter?  
     descriptionEditText.setOnEditorActionListener (new OnEditorActionListener() { 

      public boolean onEditorAction (TextView v, int actionId, KeyEvent event) { 
       boolean handled = false; 

        if (actionId == EditorInfo.IME_ACTION_SEND) { 
         String newDescription = descriptionEditText.getText().toString(); 
         String newAmount = amountEditText.getText().toString(); 
         String newDate = dateEditText.getText().toString(); 
         // add other fields here; create array newItem containing all fields 
         String [] newItem ={newDescription, newAmount, newDate}; 

         onEditorActionListener.onNewItemAdded(newItem); 
         handled = true; 
        } 
       return handled; 

      } 


     }); 
     return view; 
    } 


} 

ответ

0

Позвольте мне предложить другой подход.

Добавить кнопку в макет фрагмента.
Назовите его addNewItem("@+id/addNewItem").
Эта кнопка позволяет пользователю добавлять новый элемент.

Объявляет интерфейс, что деятельность должна осуществлять:

public interface OnAddNewItemListener { 
    public void onNewItemAdded(String[] newItem); 
} 

Вашего класс Fragment:

public class AddNewItemTextFragment extends Fragment { 

    // A Fragment event callback interface, pg 126 Meier; used to share info with host Activity 
    // Host activity listens for a new item to be created 

    public interface OnAddNewItemListener { 
     public void onNewItemAdded(String[] newItem); 
    } 

    // Create a variable to store a reference to the parent Activity that will implement the interface. 

    private OnAddNewItemListener onAddNewItemListener; 

    // This reference can be retrieved as soon as the parent has been bound to the Fragment with the Fragment's onAttach handler. 

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


    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.add_new_item_text_fragment , container, false); 

     final EditText descriptionEditText = (EditText)view.findViewById(R.id.description); 
     final EditText amountEditText = (EditText)view.findViewById(R.id.amount); 
     final EditText dateEditText = (EditText)view.findViewById(R.id.date1); 
     final Button addNewItemButton = (Button)view.findViewById(R.id.addNewItem);  

     // onClickListener for button 
     addNewItemButton.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 

      // need to add newItem as a parameter? 
      String newDescription = descriptionEditText.getText().toString(); 
      String newAmount = amountEditText.getText().toString(); 
      String newDate = dateEditText.getText().toString(); 

      // add other fields here; create array newItem containing all fields 
      String [] newItem ={newDescription, newAmount, newDate}; 

      // call method on Interface(activity) 
      onAddNewItemListener.onNewItemAdded(newItem); 
      } 
     }); 

     return view; 
    } 

} 

реализующего интерфейс активность. При нажатии кнопки AddNewItem в действии вызывается метод onNewItemAdded.

+0

Великий, после прочтения всех ваши изменения мне понравились: суммировать, вы переименовали интерфейс (спасибо), и кнопка, которую вы добавили, «возвращает» всю запись, избегая необходимости в нескольких слушателях s (спасибо также за то, что выбрали мое оригинальное представление) – whitep

1

Проблема заключается в том, что вы определяете интерфейс OnEditorActionListener с тем же именем, что и TextView.OnEditorActionListener. Если вы хотите использовать второй, вы должны явно написать префикс TextView перед ним.

Например:

public class AddNewItemTextFragment extends Fragment implements TextView.OnEditorActionListener 

... с этим следующий код будет работать:

descriptionEditText.setOnEditorActionListener(this); 

... или это:

descriptionEditText.setOnEditorActionListener (new TextView.OnEditorActionListener() { 

      public boolean onEditorAction (TextView v, int actionId, KeyEvent event) { 
... 
+0

Спасибо, что это очень полезный комментарий. Я не пробовал, но EditView.OnEditorActionListener также должен работать так же, как и TextView. , нет? – whitep

+0

Да, EdiText расширяет TextView, так что OnEditorActionListener тот же. – R4ng3LII

Смежные вопросы