0

Я хочу передать строку из одного фрагмента в другой. Я сделал следующийClassCastException.Communicate from Fragments

1) Создание интерфейса

public interface Communicator { 
public void respond(String data); } 

2) В BakeFragment (фрагмент из которого я передаю переменную) создать

public class BakeFragment extends Fragment {... 
Communicator mCallBack; 

затем в alertdialog прохожу MyString ...

builder.setNegativeButton("Заказать", new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int which) { 

        orderList.add(myString); 
        mCallBack.respond(myString); 
        Toast.makeText(getActivity(), "Вы выбрали "+myString, Toast.LENGTH_LONG).show(); 
        dialog.cancel(); 
       } 
      }); 
@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    mCallBack = (Communicator) getActivity(); 
} ...} 

3) Я получаю эту строку в MainActivity

public class MainActivity extends AppCompatActivity implements Communicator{ ... 
@Override 
public void respond(String data) { 
    FragmentManager manager = getFragmentManager(); 
    OrderFragment f2 =(OrderFragment)manager.findFragmentById(R.id.frame_container); 
    f2.changeData(data); 
} ....} 

4) Тогда я получить строку из MainActivity и перейти к OrderFragment

public class OrderFragment extends Fragment {... 
public void changeData(String data){ 
     finalOrderList.add(data); 

} ...} 

When i add item

I get this list

But when i go to order list it's empty

1) добавить элемент. 2) Когда я добавил элемент я получить этот список (screen2) 3) Когда я иду в OrderList, он пуст

MainActivity

public class MainActivity extends AppCompatActivity implements Communicator{ 
private DrawerLayout mDrawerLayout; 
private ListView mDrawerList; 
private ActionBarDrawerToggle mDrawerToggle; 

// nav drawer title 
private CharSequence mDrawerTitle; 

// used to store app title 
private CharSequence mTitle; 

// slide menu items 
private String[] navMenuTitles; 
private TypedArray navMenuIcons; 

private ArrayList<NavDrawerItem> navDrawerItems; 
private NavDrawerListAdapter adapter; 

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



    mTitle = mDrawerTitle = getTitle(); 

    // load slide menu items 
    navMenuTitles = getResources().getStringArray(R.array.nav_drawer_items); 

    // nav drawer icons from resources 
    navMenuIcons = getResources() 
      .obtainTypedArray(R.array.nav_drawer_icons); 

    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 
    mDrawerList = (ListView) findViewById(R.id.list_slidermenu); 

    navDrawerItems = new ArrayList<NavDrawerItem>(); 



    // adding nav drawer items to array 
    // Home 
    navDrawerItems.add(new NavDrawerItem(navMenuTitles[0], navMenuIcons.getResourceId(0, -1))); 
    // Find People 
    navDrawerItems.add(new NavDrawerItem(navMenuTitles[1], navMenuIcons.getResourceId(1, -1))); 
    // Photos 
    navDrawerItems.add(new NavDrawerItem(navMenuTitles[2], navMenuIcons.getResourceId(2, -1))); 
    // Communities, Will add a counter here 
    navDrawerItems.add(new NavDrawerItem(navMenuTitles[3], navMenuIcons.getResourceId(3, -1))); 
    // Pages 
    navDrawerItems.add(new NavDrawerItem(navMenuTitles[4], navMenuIcons.getResourceId(4, -1))); 
    // What's hot, We will add a counter here 
    navDrawerItems.add(new NavDrawerItem(navMenuTitles[5], navMenuIcons.getResourceId(5, -1))); 

    navDrawerItems.add(new NavDrawerItem(navMenuTitles[6], navMenuIcons.getResourceId(6, -1))); 

    navDrawerItems.add(new NavDrawerItem(navMenuTitles[7], navMenuIcons.getResourceId(7, -1))); 
    // Find People 
    navDrawerItems.add(new NavDrawerItem(navMenuTitles[8], navMenuIcons.getResourceId(8, -1))); 
    // Photos 
    navDrawerItems.add(new NavDrawerItem(navMenuTitles[9], navMenuIcons.getResourceId(9, -1))); 
    // Communities, Will add a counter here 
    navDrawerItems.add(new NavDrawerItem(navMenuTitles[10], navMenuIcons.getResourceId(10, -1))); 

    navDrawerItems.add(new NavDrawerItem(navMenuTitles[11], navMenuIcons.getResourceId(11, -1))); 


    // Recycle the typed array 
    navMenuIcons.recycle(); 

    mDrawerList.setOnItemClickListener(new SlideMenuClickListener()); 

    // setting the nav drawer list adapter 
    adapter = new NavDrawerListAdapter(getApplicationContext(), 
      navDrawerItems); 
    mDrawerList.setAdapter(adapter); 

    // enabling action bar app icon and behaving it as toggle button 
    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
    getSupportActionBar().setHomeButtonEnabled(true); 

    mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.string.navigation_drawer_open, R.string.navigation_drawer_close) { 
     public void onDrawerClosed(View view) { 
      getSupportActionBar().setTitle(mTitle); 
      // calling onPrepareOptionsMenu() to show action bar icons 
      invalidateOptionsMenu(); 

     } 

     public void onDrawerOpened(View drawerView) { 
      getSupportActionBar().setTitle(mDrawerTitle); 
      // calling onPrepareOptionsMenu() to hide action bar icons 
      invalidateOptionsMenu(); 
     } 
    }; 
    mDrawerLayout.setDrawerListener(mDrawerToggle); 

    if (savedInstanceState == null) { 


     displayView(11); 
    } 

} 

@Override 
public void respond(String data) { 
    for(int i = getSupportFragmentManager().getBackStackEntryCount() -1; i >= 0; i--) { 
     String tag = getSupportFragmentManager().getBackStackEntryAt(i).getName(); 
     OrderFragment fragment; 
     fragment=(OrderFragment)getFragmentManager().findFragmentByTag(tag); 
     FragmentManager manager = getFragmentManager(); 
     manager.beginTransaction().replace(R.id.frame_container, fragment).commit(); 
     if(fragment instanceof OrderFragment) { 
      fragment.changeData(data); 
      break; 
     } 

    } 


} 


/** 
* Slide menu item click listener 
*/ 
private class SlideMenuClickListener implements 
     ListView.OnItemClickListener { 
    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, 
          long id) { 
     // display view for selected nav drawer item 
     displayView(position); 
    } 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // toggle nav drawer on selecting action bar app icon/title 
    if (mDrawerToggle.onOptionsItemSelected(item)) { 
     return true; 
    } 
    // Handle action bar actions click 
    switch (item.getItemId()) { 
     case R.id.action_settings: 
      return true; 
     default: 
      displayView(11); 

      //Toast.makeText(getApplicationContext(), "RasRas", Toast.LENGTH_LONG).show(); 
      return true; 
    } 
} 

/* * 
* Called when invalidateOptionsMenu() is triggered 
*/ 
@Override 
public boolean onPrepareOptionsMenu(Menu menu) { 
    // if nav drawer is opened, hide the action items 
    boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList); 
    menu.findItem(R.id.action_settings).setVisible(!drawerOpen); 
    return super.onPrepareOptionsMenu(menu); 
} 

/** 
* Diplaying fragment view for selected nav drawer list item 
*/ 
private void displayView(int position) { 
    // update the main content by replacing fragments 
    Fragment fragment = null; 
    switch (position) { 
     case 0: 
      fragment = new BakeFragment(); 
      break; 
     case 1: 
      fragment = new GarnishFragment(); 
      break; 
     case 2: 
      fragment = new HotDishesFragment(); 
      break; 
     case 3: 
      fragment = new DesertsFragment(); 
      break; 
     case 4: 
      fragment = new HomeFragment(); 
      break; 
     case 5: 
      fragment = new SnacksFragment(); 
      break; 
     case 6: 
      fragment = new DrinkFragment(); 
      break; 
     case 7: 
      fragment = new PizzaFragment(); 
      break; 
     case 8: 
      fragment = new SaladFragment(); 
      break; 
     case 9: 
      fragment = new ConfectionFragment(); 
      break; 
     case 10: 
      fragment = new SoupFragment(); 
      break; 
     case 11: 
      fragment = new OrderFragment(); 
     default: 
      break; 
    } 

    if (fragment != null) { 
     FragmentManager fragmentManager = getFragmentManager(); 
     fragmentManager.beginTransaction() 
       .replace(R.id.frame_container, fragment).commit(); 

     // update selected item and title, then close the drawer 
     mDrawerList.setItemChecked(position, true); 
     mDrawerList.setSelection(position); 
     setTitle(navMenuTitles[position]); 
     mDrawerLayout.closeDrawer(mDrawerList); 
    } else { 
     // error in creating fragment 
     Log.e("MainActivity", "Error in creating fragment"); 
    } 
} 

@Override 
public void setTitle(CharSequence title) { 
    mTitle = title; 
    getSupportActionBar().setTitle(mTitle); 
} 

/** 
* When using the ActionBarDrawerToggle, you must call it during 
* onPostCreate() and onConfigurationChanged()... 
*/ 

@Override 
protected void onPostCreate(Bundle savedInstanceState) { 
    super.onPostCreate(savedInstanceState); 
    // Sync the toggle state after onRestoreInstanceState has occurred. 
    mDrawerToggle.syncState(); 
} 

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 
    // Pass any configuration change to the drawer toggls 
    mDrawerToggle.onConfigurationChanged(newConfig); 
}} 
+0

Я полагаю, что когда вы вызываете 'findFragmentById', у frame_container есть экземпляр BakeFragment, а не OrderFragment, таким образом вы получаете CassCastException. Почему вы не пытаетесь добавить свою строку в пакет и использовать ее для передачи строки из одного фрагмента в другой? –

+0

Если я правильно понимаю, что вы имеете в виду аргументы set/get. Я пытался сделать с расслоением, но я получаю NullPointerException, когда я хочу getArguments – VdovinN

ответ

1

Log говорит все это. Вы литье BakeFragment типа до OrderFragment. Я хотел бы предложить, чтобы определить тип фрагмента на основе данных Струнных вы получаете как пары:

@Override 
public void respond(String data) { 
    FragmentManager manager = getFragmentManager(); 
    if(<CheckdataForFragmentType>) 
    { 
     // if data maps to OrderFragment type 
     OrderFragment f2 =(OrderFragment)manager.findFragmentById(R.id.frame_container); 
     f2.changeData(data); 
    } 
} 
+0

я сделать следующий @Override общественного недействительного ответа (данные типа String) { OrderFragment f2 = новый OrderFragment(); FragmentManager manager = getFragmentManager(); manager.beginTransaction(). Replace (R.id.frame_container, f2) .commit(); f2.changeData (данные); } и я получаю исключение nullpointer в OrderFragment finalOrderList.add (данные); – VdovinN

+0

Похоже, finalOrderList - «null». Можете ли вы проверить это? –

+0

в OnCreate Я делаю finalOrderList = новый ArrayList (); но проблема существует – VdovinN

0

Я предполагаю, что вы OrderFragment и BakeFragment добавлены в ваш frame_container контейнер. Таким образом, чтобы избежать ClassCastException использовать следующий код:

for(int i = getSupportFragmentManager().getBackStackEntryCount() -1; i >= 0; i--) { String tag = getSupportFragmentManager().getBackStackEntryAt(i).getName(); Fragment fragment = getSupportFragmentManager().findFragmentByTag(tag); if(fragment instanceof OrderFragment) { f2.changeData(data); break; } }

Примечание: Для этой работы вам необходимо установить тег на fragmnet, когда вы добавляете фрагмент в операцию по телефону getSupportFragmentManager().beginTransaction() .add(R.id.frame_container , mFragment, "bakefragment").addToBackStack("bakefragment").commit();

+0

Я не могу использовать getSupportFragmentManager. Моя MainActivity простирается от AppCompatActivity. И я получаю несовместимые типы ... – VdovinN

+0

Затем вызовите getFragmentManager() вместо – Audumbar

+0

Фрагмент фрагмента = getSupportFragmentManager(). FindFragmentByTag (tag); если я использую Fragment, у меня нет доступа к changeData – VdovinN