Android: получение белого экрана с фрагментом транзакции

Я делаю новостное приложение, в котором у меня есть фрагмент, содержащий все новости в списке, и другой фрагмент, в котором есть список видео. Когда вы касаетесь нового, он вызывает метод из действия с именем openNewsCont, который заменит текущий фрагмент другим.

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

Вот метод, который я вызываю из MainActivity.java

public void openNewsCont(String text) {

    android.support.v4.app.FragmentManager fm = getSupportFragmentManager();
    android.support.v4.app.FragmentTransaction ft = fm.beginTransaction();
    ft.replace(R.id.pager, new NewsContent() );
    ft.addToBackStack(null);
    ft.commit();
    fm.executePendingTransactions();
 }

Вот Tab1.java, который содержит новости и вызывает метод из MainActivity.java.

package com.example.link_test;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.LinearLayout;

    public class Tab1 extends Fragment {

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

              final View android = inflater.inflate(R.layout.tab1, container, false);             
              LinearLayout newLink = (LinearLayout) android.findViewById(R.id.news1);
              newLink.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    String text = "Text from fragment";
                    MainActivity ma = (MainActivity) getActivity();
                    ma.openNewsCont(text);
                }
                });

              return android;
    } 
}

А вот фрагмент, который нужно вызвать и показывает пустой экран NewsContent.java

package com.example.link_test;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class NewsContent extends Fragment {
      @Override
      public View onCreateView(LayoutInflater inflater, ViewGroup container,
              Bundle savedInstanceState) {
            View view = inflater.inflate(R.layout.news_content, container, false);
            return view;
    }
}

3 ответа

Заменить фрагмент как:

    Fragment feeddetailFragment = new FeedDetailFragment();
feedFragment.getFragmentManager().beginTransaction()
.replace(R.id.frame_container, feeddetailFragment,Constant.FRAGMENT_FEEDDETAIL)
.addToBackStack(null)
.commit();

Это будет работать..

Если все еще не работает, попробуйте проверить фрагмент, который вы хотите показать после замены, является ли представление этого фрагмента нулевым или нет

if (view != null) {
        ViewGroup parent = (ViewGroup) view.getParent();
        if (parent != null)
            parent.removeView(view);
    }
    try {

        view = inflater.inflate(R.layout.fragment_business_details,
                container, false);

        initializeViewObjects();
        setListeners();

    } catch (InflateException e) {

        return view;
    }

    return view;
}

Я решил проблему, убрав поддержку фрагментов версии 4, поскольку это требуется только моим TabAdapter, но только для фрагментов, представленных на вкладках, таких как новости, видео и т. Д. Из фрагментов, которые не управляются как вкладки, такие как NewsContent.java

Вот как должен был выглядеть мой метод, чтобы открыть другой фрагмент из Tab1.

public void openNewsCont() {

    NewsContent nc = new NewsContent();
    FragmentManager fm = getFragmentManager();
    FragmentTransaction ft = fm.beginTransaction();
    ft.replace(R.id.container, nc);
    ft.addToBackStack(null);
    ft.commit();
 }

А вот как должен быть NewsContent:

package com.example.link_test;

    import android.app.Fragment;
    import android.os.Bundle;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;

    public class NewsContent extends Fragment {

        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        final View android = inflater.inflate(R.layout.news_content, container, false);


        return android;

        }
    }

Спасибо Eagle11 за его усилия, чтобы помочь мне с этим непонятным вопросом, на решение которого у меня ушло целое утро. Я надеюсь, что этот ответ поможет другим новичкам, как я.

Вы можете иметь этот код в действии, в котором размещены фрагменты. Он проверяет ваш стек и повторно запускает фрагмент. Это один из способов, которыми я решил решить проблему с моей стороны.

@Override
    public void onBackPressed() {
        int fragments = getFragmentManager().getBackStackEntryCount();
        Toast.makeText(this, String.valueOf(fragments), Toast.LENGTH_LONG).show();

        if (fragments == 0) {
            FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
            fragmentTransaction.replace(R.id.container, new NewsContent());
            fragmentTransaction.commit();

            super.onBackPressed();
        }
    }

Одна очевидная вещь, которая бросается в глаза, это то, что у вас есть ft.addToBackStack(null); дважды. Уверен, он должен быть там только один раз.

Кроме того, я считаю, что вам нужно вызывать fm.executePendingTransactions() непосредственно после ft.commit().

Другие вопросы по тегам