2016-11-01 8 views
0

Я пытаюсь сделать это, но ошибки.Нажмите кнопку, чтобы передать аргумент из фрагмента в другой фрагмент

Когда я нажимаю кнопку, и она выполняет функцию «showData()»; Причина, по которой я хочу выполнить эту функцию, потому что я хочу изменить фрагмент, когда Я нажимаю эту кнопку, а также «передаю аргументы» новому фрагменту. Таким образом, он будет продолжать выполнять функцию «passData()»;

Но он получит NullPointerException после 「editTextNAME.setText (имя ресторана); 」Эту строку.

showData()

public void showData(View view){ 
    RestaurantRepo repo = new RestaurantRepo(this); 
    ArrayList<HashMap<String, String>> restaurantList = repo.getRestaurantList(); 
    if (restaurantList.size()!=0) { 
     ListView lv = (ListView) findViewById(R.id.list); 
     lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view,int position, long id) { 
       restaurantID = (TextView) view.findViewById(R.id.restaurantID); 
       String idRestaurant = restaurantID.getText().toString(); 

       Bundle data = new Bundle(); 
       data.putString("restaurantID", idRestaurant); // argument 

       Fragment fraUorD = null; 
       fraUorD = new EditFragment_Fix_UorD(); 

       if (null != fraUorD) { 
        android.app.FragmentManager fragementManager = getFragmentManager(); 
        android.app.FragmentTransaction transaction = fragementManager.beginTransaction(); 
        transaction.replace(R.id.content_frame, fraUorD); 
        transaction.addToBackStack(null); 
        transaction.commit(); 
        passData(data); // when transaction done , execute passData() -> i want to pass argument when the new fragment come out 
       } 

      } 
     }); 

     ListAdapter adapter = new SimpleAdapter(MainActivity.this,restaurantList, R.layout.edit_fragment_fix_view, 
       new String[] { "id","name","type","price","phone","addr"}, 
       new int[] {R.id.restaurantID, R.id.restaurantNAME,R.id.restaurantTYPE, 
         R.id.restaurantPRICE,R.id.restaurantPHONE,R.id.restaurantADDR}); 
     lv.setAdapter(adapter); 
    } 

    else 
     Toast.makeText(this,"No restaurant!",Toast.LENGTH_SHORT).show(); // no data 

PassData()

public void passData(Bundle data){ 

    int a = Integer.parseInt(data.getString("restaurantID", "")) ; // get it 

    Toast.makeText(this, ""+a,Toast.LENGTH_SHORT).show(); 

    editTextNAME = (EditText) findViewById(R.id.editTextUpdateName); 
    editTextTYPE = (EditText) findViewById(R.id.editTextUpdateType); 
    editTextPRICE = (EditText) findViewById(R.id.editTextUpdatePrice); 
    editTextPHONE = (EditText) findViewById(R.id.editTextUpdatePhone); 
    editTextADDR = (EditText) findViewById(R.id.editTextUpdateAddr); 

    RestaurantRepo repo = new RestaurantRepo(this); 
    Restaurant restaurant = new Restaurant(); 
    restaurant = repo.getRestaurantById(a); 

    // Everything is ok, but when executing codes below here will get errors 
    // ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ 

    editTextNAME.setText(restaurant.name); 
    editTextTYPE.setText(String.valueOf(restaurant.type)); 
    editTextPRICE.setText(String.valueOf(restaurant.price)); 
    editTextPHONE.setText(restaurant.phone); 
    editTextADDR.setText(restaurant.addr); 
} 

Logcat здесь:

java.lang.NullPointerException: Попытка вызвать виртуальный метод «недействительным android.widget.EditText. setText (java.lang.CharSequence) 'на нулевой ссылке объекта на com.example.user.foody.MainActivity $ override.passData (MainActivity.java:284) at com.example.user.foody.MainActivity $ override.access $ dispatch (MainActivity.java) at com.example.user.foody.MainActivity.passData (MainActivity.java:0) at com.example.user. foody.MainActivity $ 2 $ override.onItemClick (MainActivity.java:244) at com.example.user.foody.MainActivity $ 2 $ override.access $ dispatch (MainActivity.java) at com.example.user.foody.MainActivity $ 2 .onItemClick (MainActivity.java:0)

+0

В какой файл макета 'определен R.id.editTextUpdateName'? editTextNAME имеет значение null (т. е. не может быть найдено findViewById). – Jeremy

+0

@Jeremy я пытаюсь проверить, что пять кодов, все из них являются нулевыми .. я не знаю, почему , что действительно заставляет меня смущаться – Kevin

+0

Извините, я удалил свой предыдущий комментарий. – Jeremy

ответ

0

Проблема в том, что вы не можете findviewbyId на фрагменте перед onViewCreated.

Я рекомендую прочитать это сообщение о передаче данных через фрагменты. http://gunhansancar.com/best-practice-to-instantiate-fragments-with-arguments-in-android/

важная часть:

public static MyFragment newInstance(...) 
+0

Спасибо, что так много! – Kevin

+0

Отлично! если это была ссылка helpul как разрешенная. С уважением –

+0

Привет, большое вам спасибо, но теперь у меня есть небольшая проблема. Когда я записываю фрагмент фрагмента = новый фрагмент().newInstance Этот «метод newInstance может быть выбран», но «невозможно решить». Знаете ли вы, почему? Я ошибаюсь? – Kevin

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