Помогите по фрагменту

Рейтинг: 0Ответов: 1Опубликовано: 04.11.2014

Есть класс с ListFrafment, по нажатию по какому-либо Item хочу, чтобы на Вьюшку Листа накладывался новый Фрагмент:

public class MainListPhotoshop extends ListFragment{

    protected ImageLoader loader = ImageLoader.getInstance();
    DisplayImageOptions op;

    //String[] imageUrls={"R.drawable.one","R.drawable.two","R.drawable.three"};
    String [] images={"http://t2.gstatic.com/images?q=tbn:ANd9GcSZrajzoEXNlRWjMGE9L3kqI1EsFN9P5HCNhMo4xaqLkWuhAixo",
        "http://t0.gstatic.com/images?q=tbn:ANd9GcQH7hisM_szjOKlVdQvq6m_J4lETkWxQOlAk3SMWs051TFFnmWMCA",
        "http://3.bp.blogspot.com/-kAhN0HX-MBk/T_5bApfhbJI/AAAAAAAAAuI/lUww8xT9yV8/s1600/smileys_001_01.png"};

    @Override   
    public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {
        ArrayAdapter<String> setListAdapter = new ArrayAdapter<String>(getActivity(), R.layout.image_listview_layout,images);

        op = new DisplayImageOptions.Builder()
            .showStubImage(R.drawable.ic_stub)
            .showImageForEmptyUri(R.drawable.ic_empty)
//          .showImageOnFail(R.drawable.ic_error)
            .cacheInMemory()
            .cacheOnDisc()
            .displayer(new RoundedBitmapDisplayer(20))
            .build();

        setListAdapter(new ItemAdapter());

        return super.onCreateView(inflater,container, savedInstanceState);
    }
    @Override
    public void onListItemClick(ListView l, View v, int position, long id){
        switch(position){
            case 0: 
    HomeFragment f4 = new HomeFragment();   
    FragmentTransaction ft= getFragmentManager().beginTransaction();
    ft.replace(R.id.number_container10, f4);
    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
    ft.addToBackStack(null);
    ft.commit();
        break;
             case 1:

        break;
    }
}

//    private void startImagePagerActivity(int position) {
//        Intent intent = new Intent(this, ImagePagerActivity.class);
//        intent.putExtra(Extra.IMAGES, imageUrls);
//        intent.putExtra(Extra.IMAGE_POSITION, position);
//        startActivity(intent);
//    }

    class ItemAdapter extends BaseAdapter
    {

        //private ImageLoadingListener animate = new AnimateFirstDisplayListener();

        private class ViewHolder {
            public TextView text;
            public ImageView image;

        }

        public int getCount() {
            return images.length;
        }

        public Object getItem(int position) {
            return position;
        }

        public long getItemId(int position) {
            return position;
        }

        public View getView(int position, View convertView, ViewGroup parent) {
            View vi=convertView;

            final ViewHolder holder;
            if (convertView == null) {

                LayoutInflater inflater = getActivity().getLayoutInflater();

                vi = inflater.inflate(R.layout.image_list_layout, parent, false);

                holder = new ViewHolder();
                holder.text = (TextView) vi.findViewById(R.id.text);
                holder.image = (ImageView) vi.findViewById(R.id.image);
                vi.setTag(holder);

            } else {
                holder = (ViewHolder) vi.getTag();

            }

            holder.text.setText("Item " + (position + 1));
            loader.init(ImageLoaderConfiguration.createDefault(getActivity()));     
            loader.displayImage(images[position], holder.image, op, null);

            return vi;
        }
    }
}

В HomeFragment все просто!

public class HomeFragment extends Fragment {

    public HomeFragment(){

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        View rootView = inflater.inflate(R.layout.fragment_home, container, false);

        return rootView;
    }
}

Его XML:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <TextView
        android:id="@+id/txtLabel"
         android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:textSize="16dp"
        android:text="бла бла бла"/>

    <ImageView android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/txtLabel"
        android:src="@drawable/ic_home"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="10dp"/>
   <FrameLayout
         android:id="@+id/number_container10"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"/>
</RelativeLayout>

Но он не накладывается как (replace), а просто выбивает

IllegalArgumentException: No view found for id

Ответы

▲ 1Принят

А вы уверены, что оба фрагмента своим родительским элементом имеют одну и ту же вьюху?
И на какой конкретно строчке кода вылетает? Надо больше инфы с LogCat.

Обновление

Хм... ХЗ. Вдруг поможет замена

FragmentTransaction ft= getFragmentManager().beginTransaction();

на

FragmentTransaction ft= getActivity().getFragmentManager().beginTransaction();

Обновление 1

А приведённый вами xml - это лэйаут 1-го фрагмента? Который ListFragment? Если так, то у вас и не должно, по идее, получиться заменить его фрагментом, вставляющемся в элемент его лэйаута.

Надо в методе replace() указать id лэйаута, в котором находится сам ListFragment.

Если же вы хотите добавить фрагмент в фрагмент, то надо пользовать метод getChildFragmentManager() 1-го фрагмента и вместо replace() использовать add().

(мысль отсюда: ссылка на stackoverflow)

Обновление 2

приведённый мной xml - это лэйаут HomeFragment фрагмента

Нельзя добавить фрагмент в контейнер, коий он сам содержит. Это как положить коробку в саму себя. =)

Поменяйте

ft.replace(R.id.number_container10, f4);

на:

ft.replace(id_лэйаута_содержащего_ListFragment, f4);

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

Обновление 3:

Итак:

  1. У вас должно быть активити, в лэйауте которого должен быть контейнер для фрагментов с id (например, R.id.yours_list_fragment_container_in_activity_layout).
  2. Из активити в контейнер с id помещаете свой фрагмент-список.
  3. Кликаете по элементу, берёте FragmentManager вашей активити и id контейнера вашего ListFragment в лэйауте вашей активити:

    HomeFragment f4 = new HomeFragment(); FragmentTransaction ft= getActivity().getFragmentManager().beginTransaction(); ft.replace(R.id.yours_list_fragment_container_in_activity_layout, f4); ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); ft.addToBackStack(null); ft.commit();

Теперь-то работает?