从另一个片段返回时如何在视图页面中显示片段?

Posted

技术标签:

【中文标题】从另一个片段返回时如何在视图页面中显示片段?【英文标题】:How to show fragments in viewpager when back from another fragment? 【发布时间】:2015-12-21 18:59:39 【问题描述】:

我在几个片段中有一个片段是 viewPager,其中每个节目都包含一个 listiview。当我们转到下一个片段时单击任何项​​目列表视图,但是当下一个片段后退按钮在我的 viewpager 中没有显示任何内容时

public class HomePage extends Fragment 

private View view;
private HomeTabsAdapter mAdapter;
private ViewPager mPagerHome;
public PagerSlidingTabStrip mTabs;
private Typeface typeface;


@Override
public View onCreateView(LayoutInflater inflater,  ViewGroup container,  Bundle savedInstanceState) 
    view = inflater.inflate(R.layout.homepage_fragment, container, false);

    mTabs = (PagerSlidingTabStrip) view.findViewById(R.id.TabsHome);
    mPagerHome = (ViewPager) view.findViewById(R.id.pagerHome);

    ArrayList<String> title = new ArrayList<>();
    title.add("خبر داغ");
    title.add("اقتصادی");
    title.add("بین المللی");


    mAdapter = new HomeTabsAdapter(HomePage.this.getFragmentManager(), title);
    mPagerHome.setAdapter(mAdapter);

    mPagerHome.setCurrentItem(title.size());
    mTabs.setViewPager(mPagerHome);


     typeface = Typeface.createFromAsset(getActivity().getAssets(),"fonts/IRAN-Sans.ttf");


    //jologiri az 3 noghte kardane esme tab ha va font
    LinearLayout tabsContainer = (LinearLayout) mTabs.getChildAt(0);
    for (int i = 0; i < tabsContainer.getChildCount(); i++) 
        TextView tab = (TextView) tabsContainer.getChildAt(i);
        tab.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.MATCH_PARENT, 1.0f));
        tab.setPadding(8, 0, 8, 0);
        tab.setTypeface(typeface);
    

    return view;

和我的视图寻呼机适配器

public class HomeTabsAdapter extends FragmentPagerAdapter 


public ArrayList<String> mTitle;

public HomeTabsAdapter(FragmentManager fm, ArrayList<String> mTitle) 

    super(fm);
    this.mTitle = mTitle;



@Override
public Fragment getItem(int position) 

    switch (position)
        case 0:
            return HotNews.newInstance();
        case 1:
            return  Economic.newInstance();
        case 2:
            return International.newInstance();

    

    return null;


@Override
public int getCount() 
    return mTitle.size();


@Override
public CharSequence getPageTitle(int position) 
    return mTitle.get(position);

和片段之一

public class International extends Fragment 

private View view;
private ItemNews itemNews;
private NewsAdapter adapter;
private FloatingActionButton btn;
private ExpandableListView list;
private static final int SCROLL_TO_TOP = -1;
private static final int SCROLL_TO_BOTTOM = 1;
private static final int SCROLL_DIRECTION_CHANGE_THRESHOLD = 5;
private int mScrollDirection = 0;
private ItemChild childItem;
private ArrayList<ItemChild> child;

public static International newInstance()
    International international = new International();
    return international;



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


    view = inflater.inflate(R.layout.listnews_fragment, container, false);
    list = (ExpandableListView) view.findViewById(R.id.ListNews);
    list.setGroupIndicator(null);


    String text = " مسی به همراه بارسلونا ۶ بار قهرمان لالیگا، دو بار قهرمان جام حذفی اسپانیا، پنج بار برنده سوپرکاپ اسپانیا، سه بار قهرمان لیگ قهرمانان اروپا، دو بار\n" +
            " قهرمان سوپر کاپ اروپا و دو بار قهرمان جام باشگاه‌های جهان شده است. مسی اولین و تنها بازیکنی است که در چهار رقابت لیگ قهرمانان اروپا به عنوان آ";

    child = new ArrayList<>();
    for (int i = 0; i <2; i++) 
        childItem = new ItemChild();
        childItem.setId(i);
        childItem.setImageChild("http://bit.do/logo00");
        childItem.setTitleChild("ورزش سه -");
        childItem.setDate("8ساعت قبل");
        child.add(childItem);

    


    List<ItemNews> news = new ArrayList<>();
    for (int i = 0; i < 10; i++) 
        itemNews = new ItemNews();
        itemNews.setId(i);
        itemNews.setmIconSource("http://bit.do/logo00");
        itemNews.setmImage("http://bit.do/image00");
        itemNews.setmSource("ورزش سه -");
        itemNews.setmTime("8ساعت قبل");
        itemNews.setmTitle("messi");
        itemNews.setmNews(text);
        itemNews.setChild(child);
        news.add(itemNews);

    


    adapter = new NewsAdapter(International.this, news,getActivity());
    list.setAdapter(adapter);


    btn = (FloatingActionButton) view.findViewById(R.id.Floating);


    list.setOnScrollListener(new AbsListView.OnScrollListener() 

        int mScrollPosition;

        @Override
        public void onScrollStateChanged(AbsListView view, int scrollState) 

        

        @Override
        public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) 

            View topChild = view.getChildAt(0);

            int newScrollPosition = 0;
            if (topChild == null) 
                newScrollPosition = 0;
             else 
                newScrollPosition = -topChild.getTop() + view.getFirstVisiblePosition() * topChild.getHeight();
            

            if (Math.abs(newScrollPosition - mScrollPosition) >= SCROLL_DIRECTION_CHANGE_THRESHOLD) 
                onScrollPositionChanged(mScrollPosition, newScrollPosition);
            

            mScrollPosition = newScrollPosition;
        
    );


    return view;

【问题讨论】:

【参考方案1】:

尝试在您的 FragmentActivity 类中实现 onBackPressed() 使用寻呼机getCurrentItem().....它肯定会工作:)

【讨论】:

我在 fragment.v4 中的寻呼机和在活动中的片段并且不使用片段活动

以上是关于从另一个片段返回时如何在视图页面中显示片段?的主要内容,如果未能解决你的问题,请参考以下文章

从另一个片段返回时返回到屏幕上的当前位置

我如何使用视图模型从另一个片段访问函数

从另一个片段的其他视图控制片段的视图

如何从另一个片段访问片段对象

如何将 View 类中的代码片段移动到 OnAppearing() 方法?

当片段视图加载是异步任务的一部分时,如何在片段加载之前显示进度条?