Я пытаюсь вызвать новый фрагмент из адаптера курсора, но получаю resourceNotFoundException или addView не поддерживается

*Я хочу иметь возможность вызывать новый фрагмент, когда пользователь нажимает кнопку, которая находится на каждом элементе в списке, но при этом возникает исключение *

  @Override
    public void bindView(View convertView, Context context, Cursor cursor) {

        final ViewHolder view_handler = new ViewHolder();

        ...
        ...


        view_handler.update_button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {


                FragmentManager fm = frag_context.getSupportFragmentManager(); 
        AddProfFragment frag = new AddProfFragment();
        FragmentTransaction transaction = fm.beginTransaction();

        transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
        transaction.replace(((ViewGroup) parent_view.getParent()).getId(), frag).addToBackStack(null).commit();

    }

Ее, как я получаю parent_view и frag_context

public ProfessorCardAdapter(Context context, Cursor c, boolean autoRequery) {
    super(context, c, autoRequery);
    appContext = context;
    dataSource = new ProfessorDataSource(context);
    frag_context = (FragmentActivity) context;
    this.c = c;
}

 @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {
        // when the view will be created for first time,
        // we need to tell the adapters, how each item will look
        LayoutInflater inflater = LayoutInflater.from(parent.getContext());
        View retView = inflater.from(context).inflate(R.layout.professors_list_item, parent, false);
        parent_view = parent;
        return retView;
    }

Трассировки стека:

android.content.res.Resources$NotFoundException: Unable to find resource ID #0xffffffff
            at android.content.res.Resources.getResourceName(Resources.java:1773)
            at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:919)
            at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104)
            at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
            at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1467)
            at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:440)
            at android.os.Handler.handleCallback(Handler.java:733)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5017)
            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:779)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
            at dalvik.system.NativeStart.main(Native Method)
  • Я попробовал следующий метод, который дает мне другую ошибку «java.lang.UnsupportedOperationException: addView (View) не поддерживается в AdapterView» *

    FragmentManager fm = frag_context.getSupportFragmentManager(); Фрагмент AddProfFragment = новый AddProfFragment(); Транзакция FragmentTransaction = fm.beginTransaction();

            transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
            transaction.replace(parent_view.getId(), frag).addToBackStack(null).commit();
    

person halliK-C    schedule 06.03.2014    source источник
comment
Пожалуйста, обновите свой вопрос с вашим кодом.   -  person Manitoba    schedule 06.03.2014
comment
Имя ресурса, который раздувается во фрагмент, неверно. Он должен быть в форме R.layout.name_of_my_xml_layout.   -  person CurlyPaul    schedule 06.03.2014
comment
Можем ли мы увидеть код в конструкторе AddProfFragment?   -  person CurlyPaul    schedule 06.03.2014
comment
AddProfFragment — это класс фрагмента. как вы думаете, я должен поставить конструктор? извините за глупые вопросы, я новичок в андроиде   -  person halliK-C    schedule 06.03.2014
comment
Мне нужна строка, на которой создается экземпляр адаптера курсора. В частности, мне нужно увидеть, как фрагмент назначается адаптеру курсора (чтобы при вызове newView родительская группа ViewGroup фактически была тем же фрагментом, что я не думаю, и поэтому нулевая ссылка).   -  person samis    schedule 06.03.2014
comment
@SamusArin я отредактировал код   -  person halliK-C    schedule 10.03.2014
comment
Мне было бы намного проще увидеть больше кода, здесь просто недостаточно, чтобы соединить все точки. Если вы опубликуете весь связанный код, это будет здорово. При извлечении этого, не могли бы вы опубликовать строку, которая вызывает исключение (я думаю, что это transaction.replace(...), но не положительный). Спасибо.   -  person samis    schedule 10.03.2014


Ответы (2)


Итак, я наконец нашел простой способ решить вопрос. Мне пришлось передать родительское представление через конструктор. Я думаю, что код объяснит это лучше..

Из ProfessorFragment, который содержит список, который, в свою очередь, использует пользовательский адаптер, я получаю ссылку на родительское представление и передаю его в конструктор адаптера.

 new android.os.Handler().post(new Runnable() {
            @Override
            public void run() {
                cursor = dataSource.getAllProfessors();
                /*Get parent view*/
                parent_view = ((ViewGroup) getView().getParent());
                adapter = new ProfessorCardAdapter(getActivity(), cursor, true, parent_view);
                professors_listview.setAdapter(adapter);
                adapter.notifyDataSetChanged();
            }
        });

Затем в моем адаптере курсора я получаю родительское представление, подобное этому

public ProfessorCardAdapter(Context context, Cursor c, boolean autoRequery, ViewGroup p_view) {
    super(context, c, autoRequery);
    appContext = context;
    dataSource = new ProfessorDataSource(context);
    frag_context = (FragmentActivity) context;
    parent_view = p_view;
    this.c = c;
}

Теперь с этим родительским представлением я могу вызвать новый фрагмент, не нарушая иерархию представлений.

FragmentManager fm = frag_context.getSupportFragmentManager();
UpdateProfessorFragment frag = new UpdateProfessorFragment();
FragmentTransaction transaction = fm.beginTransaction();
transaction.replace(parent_view.getId() , frag).addToBackStack(null).commit();

Это сработало отлично для меня .. спасибо всем за поддержку :)

person halliK-C    schedule 11.03.2014
comment
Рад слышать... Вам следует создать настоящую/не анонимную учетную запись SO. Здесь отличное сообщество. - person samis; 13.03.2014

0xFFFFFFFF = -1

Это означает, что вы используете неверный идентификатор ресурса.

Проверьте, что возвращает parent_view.getParent()).getId()

person Jehy    schedule 06.03.2014
comment
parent_view.getParent()).getId() возвращает -1. Я не уверен, что это лучший способ вызвать новый фрагмент из адаптера курсора. - person halliK-C; 06.03.2014
comment
Проверьте, что там внутри parent_view.getParent(). Если это не так, также проверьте сам parent_view. - person Jehy; 07.03.2014
comment
я пробовал parent_view.getId(), но получаю следующую ошибку: addView(View) не поддерживается в AdapterView - person halliK-C; 10.03.2014