2016-01-28 3 views
0

У меня есть 1 активность и 2 фрагмента. В меню ящика есть два элемента: Fragment1 и Fragment2. В фрагменте1 у меня есть editText и кнопка. Когда я нажимаю на кнопку - текст из поля должен быть записан в спискеView второго фрагмента. Пожалуйста, помогите мне, как я могу это сделать.Фрагменты взаимодействия

I изменен код, но когда я нажимаю на кнопку, приложение прекратилось. Пожалуйста, помогите мне.

MainActivity

public class MainActivity extends AppCompatActivity implements ScreenOne.OnFragmentInteractionListener { 

Drawer drawerResult; 
ArrayList<String> arrayItems; 


String message; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 


    PrimaryDrawerItem item1 = new PrimaryDrawerItem() 
      .withName(R.string.navigation_menu_item1) 
      .withIdentifier(1); 

    PrimaryDrawerItem item2 = new PrimaryDrawerItem() 
      .withName(R.string.navigation_menu_item2) 
      .withIdentifier(2); 

    drawerResult = new DrawerBuilder() 
      .withActivity(this) 
      .withToolbar(toolbar) 
      .withActionBarDrawerToggleAnimated(true) 
      .withHeader(R.layout.drawer_header) 
      .addDrawerItems(item1) 
      .addDrawerItems(item2) 
      .withOnDrawerItemClickListener(new Drawer.OnDrawerItemClickListener() { 
       @Override 
       public boolean onItemClick(View view, int position, IDrawerItem drawerItem) { 

        FragmentManager manager = getSupportFragmentManager(); 
        FragmentTransaction transaction = manager.beginTransaction(); 
        Fragment fragment = new Fragment(); 

        switch (position){ 
         case 1: 
          fragment = new ScreenOne(); 
          break; 
         case 2: 
          fragment = new ScreenTwo(arrayItems); 
          break; 
        } 
        transaction.replace(R.id.content, fragment); 
        transaction.commit(); 

        return false; 
       } 
      }) 
      .build(); 
} 

@Override 
public void onBackPressed(){ 
    if(drawerResult.isDrawerOpen()){ 
     drawerResult.closeDrawer(); 
    } 
    else{ 
     super.onBackPressed(); 
    } 
} 
@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.menu_main, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 

    //noinspection SimplifiableIfStatement 
    if (id == R.id.action_settings) { 
     return true; 
    } 

    return super.onOptionsItemSelected(item); 
} 



@Override 
public void onFragmentInteraction(String msg) { 
    arrayItems.add(msg); 
} 

}

ScreenOne или fragment1

public class ScreenOne extends Fragment { 

Button btnAdd; 
EditText et; 
private OnFragmentInteractionListener mListener; 
ArrayList<String> items; 



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

    btnAdd = (Button) view.findViewById(R.id.btnAdd); 
    et = (EditText) view.findViewById(R.id.et); 

    btnAdd.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      String str = et.getText().toString(); 
      mListener.onFragmentInteraction(str); 
      items.add(str); 
      //updateDetail(); 
     } 
    }); 

    return view; 
} 


public interface OnFragmentInteractionListener { 

    void onFragmentInteraction(String msg); 
} 



@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 
    try { 
     mListener = (OnFragmentInteractionListener) activity; 
    } catch (ClassCastException e) { 
     throw new ClassCastException(activity.toString() 
       + " должен реализовывать интерфейс OnFragmentInteractionListener"); 
    } 
} 

public void updateDetail() { 
    // генерируем некоторые данные 
    String newTime = String.valueOf(System.currentTimeMillis()); 
    // Посылаем данные Activity 
    mListener.onFragmentInteraction(newTime); 
} 

}

ScreenTwo или FRAGMENT2

public class ScreenTwo extends Fragment { 

ArrayAdapter<String> adapter; 
ArrayList<String> itemArray; 

public ScreenTwo(ArrayList<String> itemArray){ 
    this.itemArray = itemArray; 
} 

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

    ListView listView = (ListView) view.findViewById(R.id.lvName); 

    itemArray = new ArrayList<>(); 
    itemArray.clear(); 

    adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, itemArray); 
    listView.setAdapter(adapter); 
    return view; 
} 

ответ

0

Я предполагаю, что вы можете добавить третий метод в свой интерфейс OnFragmentInteractionListener, который возвращает List<String> links, который будет списком ссылок, сохраненных с ScreenOne.

Когда ScreenTwo будет прикреплен (в onAttach(Activity) обратном вызове) к действию, он будет извлекать этот список и создавать пользовательский интерфейс на его основе.

Еще одна хорошая вещь - объявить еще один «прослушивающий» интерфейс, поэтому каждый раз, когда вы вызываете onFragmentInteraction(String), вы будете уведомлять всех слушателей об изменениях, произошедших.

+0

Вы видите ошибку? и как их исправить? – user3729037

+0

Прежде всего, я вижу, что вы не инициализировали элементы ArrayList , поэтому вызов items.add (str) вызывает NullPointerException. Кроме того, в SecondFragment, я не понимаю пункт очистки itemArray ?? в этом случае вы удаляете все данные, которые вы передали в конструктор. Совет. Не создавайте настраиваемые конструкторы для фрагментов. Вместо этого используйте статическую функцию newInstance (args) и передайте полезную нагрузку с помощью наборов с помощью setArguments (Bundle bundle) – VanKhulup

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