簡體   English   中英

Android:使用片段事務獲取白屏

[英]Android: Getting white screen with fragment transaction

我正在制作一個新聞應用程序,其中我有一個片段,其中包含列表中的所有新聞以及另一個包含視頻列表的片段。 當你觸摸一個新的時,它將從名為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;
    }
}

將片段替換為:

    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;
}

一個顯而易見的事情是,你有ft.addToBackStack(null); 兩次。 很確定它應該只在那里一次。

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

我通過刪除對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努力幫助我解決這個讓我整整一個早上需要解決的問題。 我希望這個答案可以幫助像我這樣的新手。

您可以在托管片段的活動上使用此代碼。 它會檢查您的堆棧並重新啟動片段。 這是我決定在我這個問題上處理這個問題的方法之一。

@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();
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM