2015-09-29 2 views
0

Мне нужно заменить фрагмент на другой методом onItemClick. Это то, что я пытаюсь:Попытка заменить один фрагмент на другой

public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 

     TipoRestaurante rteActual = (TipoRestaurante) adapter.getItem(position); 
     String msg = "Has elegido el tipo " + rteActual.getNombre_tipo(); 
     Toast.makeText(getActivity(), msg, Toast.LENGTH_LONG).show(); 

     Fragment newFragment = new TabFragmentComer(); 
     FragmentTransaction transaction = getFragmentManager().beginTransaction(); 


     transaction.replace(R.id.containerView, newFragment); 
     transaction.addToBackStack(null); 


     transaction.commit(); 


    } 

Но я получаю исключение:

09-28 23:51:02.310 14895-14895/com.solinpromex.elpasojuarezexperience E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    Process: com.solinpromex.elpasojuarezexperience, PID: 14895 
    java.lang.IllegalArgumentException: No view found for id 0x7f0d009b (com.solinpromex.elpasojuarezexperience:id/containerView) for fragment TabFragmentComer{42909b40 #1 id=0x7f0d009b} 
      at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:947) 
      at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1138) 
      at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:740) 
      at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1501) 
      at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:458) 
      at android.os.Handler.handleCallback(Handler.java:808) 
      at android.os.Handler.dispatchMessage(Handler.java:103) 
      at android.os.Looper.loop(Looper.java:193) 
      at android.app.ActivityThread.main(ActivityThread.java:5299) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:515) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:825) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:641) 
      at dalvik.system.NativeStart.main(Native Method) 

Я поступающую к текущему фрагменту от деятельности, например:

if (menuItem.getItemId() == R.id.nav_item_comer) { 
        FragmentTransaction xfragmentTransaction = mFragmentManager.beginTransaction(); 
        xfragmentTransaction.replace(R.id.containerView,new TabFragmentComerTiposRestaurante()).commit(); 
       } 

Любые помощь приветствуется

EDIT: MainActivity xml layout:

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fitsSystemWindows="true" 
    android:orientation="vertical"> 

    <android.support.v7.widget.Toolbar 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:background="@color/rojomodesto" 
     android:id="@+id/toolbar" 
     android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" 
     app:title="El Paso - Juárez Experience" /> 

    <android.support.v4.widget.DrawerLayout 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:app="http://schemas.android.com/apk/res-auto" 
     android:layout_height="match_parent" 
     android:layout_width="match_parent" 
     android:id="@+id/drawerLayout" 
     > 



    <FrameLayout 
     android:orientation="vertical" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:id="@+id/containerView"> 
    </FrameLayout> 



    <android.support.design.widget.NavigationView 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:app="http://schemas.android.com/apk/res-auto" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:layout_gravity="start" 
     android:id="@+id/shitstuff" 
     app:itemTextColor="@color/black" 
     app:menu="@menu/drawermenu" 
     android:layout_marginTop="-24dp" 
     /> 



    </android.support.v4.widget.DrawerLayout> 

    </LinearLayout> 
+0

может ли вы отправить сообщение xml? – Rajesh

+0

Xml layout, где находится R.id.containerView? – Nanoc

+0

@RajeshJadav, вы имеете в виду xml от активности или от текущего фрагмента? – mvasco

ответ

1

Ваш фрагмент должен иметь интерфейс в нем следующим образом:

public class MyFragment extends Fragment { 

    private OnFragmentInteractionListener mListener; 

    public MyFragment() { 
    } 


    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View view = ...; 
     return view; 
    } 

    public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 

     TipoRestaurante rteActual = (TipoRestaurante) adapter.getItem(position); 
     String msg = "Has elegido el tipo " + rteActual.getNombre_tipo(); 
     Toast.makeText(getActivity(), msg, Toast.LENGTH_LONG).show(); 

     Fragment newFragment = new TabFragmentComer();  

     if(mListener != null){ 
      mListener.onFragmentInteraction(newFragment); 
     } 


    } 

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

    @Override 
    public void onDetach() { 
     super.onDetach(); 
     mListener = null; 
    } 

    public interface OnFragmentInteractionListener { 
     public void onFragmentInteraction(Fragment fragment); 
    } 

} 

Ваша деятельность должна реализовать этот интерфейс:

MyActivity extends Activity implements OnFragmentInteractionListener{ 
//your activity methods... 

@Override 
    public void onFragmentInteraction(Fragment fragment) { 
     //here you have that fragment and can change it with transactions 
     FragmentTransaction transaction = getFragmentManager().beginTransaction(); 

     transaction.replace(R.id.containerView, fragment); 
     transaction.addToBackStack(null); 
     transaction.commit(); 
    } 
} 

Чтобы передать объекты другой фрагмент :

Если фрагмент только фрагмент вы создаете выше как newFragment вы можете добавить аргументы к нему следующим образом:

Fragment newFragment = new TabFragmentComer(); 
Bundle args = new Bundle(); 
args.putInt("myIntLabel", 2); 
args.putString("myStringLabel", "my sample string"); 
//and you can add all you want to that bundle like this 
newFragment.setArguments(args); 

Затем в фрагменте onCreateView или OnCreate метод вы можете получить этот пакет, как это:

... 
Bundle args = getArguments(); 
int myInt = args.getInt("myIntLabel", (int defaultValue)); // returns 2 
int myString = args.getString("myStringLabel", (String defaultString)); // returns "my sample string" 

и если вы не создаете свой фрагмент в этом фрагменте вы можете добавить еще один аргумент в этот метод интерфейса, как Bundle args и добавить, что расслоение на ваш фрагмент, где вы создаете так: fragment.setArguments(args)

+0

Спасибо, Саид, я попробую ваше предложение прямо сейчас. – mvasco

+0

@mvasco приветствуется. Вы можете добавить это ко всем своим фрагментам и обработать все транзакции в своей деятельности. –

+0

У меня есть предупреждение в строке: FragmentTransaction transaction = getFragmentManager(). BeginTransaction(); – mvasco

0

попробуйте выполнить замену фрагмента.

 Products_Fragment df = new Products_Fragment();//this is your fragment. 
     FragmentManager fm = getFragmentManager(); 
     FragmentTransaction ft = fm.beginTransaction(); 
     ft.replace(R.id.content_frame, df); 
     ft.commit(); 
+0

Спасибо @Ganpat, но есть ответ, который работает для меня. – mvasco

+0

Если ответ для вас работает, тогда вы можете голосовать и отвечать правильно, потому что другие могут использовать этот ответ, спасибо –

+0

Я сделал это @ganpat – mvasco

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