Android:使用片段事务获取白屏

问题描述 投票:5回答:4

我正在制作一个新闻应用程序,其中我有一个片段,其中包含列表中的所有新闻以及另一个包含视频列表的片段。当你触摸一个新的时,它将从名为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();
 }

这是保存新闻并从MainActivity.java调用方法的Tab1.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;
    }
}
java android android-fragments fragment fragmenttransaction
4个回答
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;
}

0
投票

一个显而易见的事情是,你有ft.addToBackStack(null);两次。很确定它应该只在那里一次。

另外,我相信你需要在ft.commit()之后直接调用fm.executePendingTransactions()。


0
投票

我通过删除对v4片段的支持解决了这个问题,因为这只是我的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努力帮助我解决这个让我整整一个早上需要解决的问题。我希望这个答案可以帮助像我这样的新手。


0
投票

您可以在托管片段的活动上使用此代码。它会检查您的堆栈并重新启动片段。这是我决定在我这个问题上处理这个问题的方法之一。

@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();
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.