无法在FragmentPagerAdapter上获取当前片段

时间:2016-02-04 08:08:23

标签: android android-fragments

我遇到了一个非常简单的问题。 我只是想知道当我在它上面时我正在处理什么片段位置所以我可以更改工具栏标题,这应该很简单 - 但我已经用我整个上午试图找出它

不工作,返回错误的数字:

FragmentStatePagerAdapter

未知支持废话

getChildFragmentManager

返回错误的数字..

getItem(int position)

我的代码:

import android.content.Context;
import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.util.AttributeSet;

import java.util.ArrayList;

import z.R;
import z.common.BaseFragment;
import z.common.ToolBar;
import z.utility.IntegerIncrementer;
import z.utility.Logger;

public class MainUIViewPager extends ViewPager {

    private ArrayList<Tab> uiTabs = new ArrayList<>();

    private ToolBar mainUiToolBar;

    public MainUIViewPager(Context context) {
        super(context);
    }

    public MainUIViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public void init(AppCompatActivity activity) {

        // Make tabs
        IntegerIncrementer integerIncrementer = new IntegerIncrementer(0);
        uiTabs.add(new Tab(integerIncrementer.getAndIncrease(), R.drawable.tab_latest_changes, getResources().getString(R.string.tab_latest_changes), new FragmentLatestChanges()));
        uiTabs.add(new Tab(integerIncrementer.getAndIncrease(), R.drawable.tab_tasks, getResources().getString(R.string.tab_tasks), new FragmentTasks()));
        uiTabs.add(new Tab(integerIncrementer.getAndIncrease(), R.drawable.tab_events, getResources().getString(R.string.tab_events), new FragmentLatestChanges()));
        uiTabs.add(new Tab(integerIncrementer.getAndIncrease(), R.drawable.tab_messages, getResources().getString(R.string.tab_messages), new FragmentLatestChanges()));
        uiTabs.add(new Tab(integerIncrementer.getAndIncrease(), R.drawable.tab_more, getResources().getString(R.string.tab_more), new FragmentLatestChanges()));

        // Create the adapter that will return a fragments
        this.setAdapter(new SectionsPagerAdapter(activity.getSupportFragmentManager()));

        // Setup tab layout with icons and this view pager.
        TabLayout tabLayout = (TabLayout) activity.findViewById(R.id.main_ui_tabs);
        tabLayout.setupWithViewPager(this);
        for (Tab tab : uiTabs) {
            tabLayout.getTabAt(tab.getPosition()).setIcon(tab.getDrawableResource());
        }

        mainUiToolBar = (ToolBar) activity.findViewById(R.id.main_ui_toolbar);
        mainUiToolBar.setTitle(uiTabs.get(0).getTitle());

        //TODO Remove, replaces the interface callback from SectionsPagerAdapter so nothing gets called..... why is android so crappy
        /*
        tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {

                Logger.logInfo("onTabSelected:" + tab.getPosition());
                mainUiToolBar.setTitle(uiTabs.get(tab.getPosition()).getTitle());
            }
            @Override
            public void onTabUnselected(TabLayout.Tab tab) {}
            @Override
            public void onTabReselected(TabLayout.Tab tab) {}
        });
        */

    }

    /**
     * A {@link FragmentPagerAdapter} that returns a fragment corresponding to
     * one of the sections/tabs/pages.
     */
    public class SectionsPagerAdapter extends FragmentPagerAdapter {

        public SectionsPagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int position) {
            // getItem is called to instantiate the fragment for the given page.
            // Return a PlaceholderFragment (defined as a static inner class below).

            Logger.logInfo("Getting tab of: " + String.valueOf(position));

            //mainUiToolBar.setTitle(uiTabs.get(position).getTitle());

            return uiTabs.get(position).getBaseFragment();
        }



        @Override
        public CharSequence getPageTitle(int position) {
            // We don't want to display a tab title, setting null stops the view from being displayed here. Android design pattern.
            return null;
        }

        @Override
        public int getCount() {
            return uiTabs.size();
        }
    }

    private class Tab {
        private int position;
        private int drawableResource;
        private String title;
        private BaseFragment baseFragment;

        public Tab(int position, int drawableResource, String title, BaseFragment baseFragment) {
            this.position = position;
            this.title = title;
            this.drawableResource = drawableResource;
            this.baseFragment = baseFragment;
        }

        public int getPosition() {
            return position;
        }

        public int getDrawableResource() {
            return drawableResource;
        }

        public String getTitle() {
            return title;
        }

        public BaseFragment getBaseFragment() {
            return baseFragment;
        }
    }
}

2 个答案:

答案 0 :(得分:0)

找到一个简单的解决方案,不会像我之前找到的解决方案那样涉及大量黑客和躲闪代码。

简单地这样做:

        tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {

                Logger.logInfo("onTabSelected:" + tab.getPosition());
                mainUiToolBar.setTitle(uiTabs.get(tab.getPosition()).getTitle());

                // This is how the tab is changed manually.
                setCurrentItem(tab.getPosition());
            }
            @Override
            public void onTabUnselected(TabLayout.Tab tab) {}
            @Override
            public void onTabReselected(TabLayout.Tab tab) {}
        });

答案 1 :(得分:-1)

如果我很清楚你在问什么:

$View = @(
 @{l='Handles';e={$_.HandleCount}},
 @{l='NPM(K)';e={ (Get-Process -Id $_.ProcessId).NonpagedSystemMemorySize/1KB -as [int]}},
 @{l='PM(K)';e={ $_.PrivatePageCount/1KB -as [int]}},
 @{l='WS(K)';e={ $_.WorkingSetSize/1KB -as [int]}},
 @{l='VM(M)';e={ $_.VirtualSize/1mB -as [int]}},
 @{l='CPU(s)';e={ (Get-Process -Id $_.ProcessId).CPU -as [int]}},
 @{l='Id';e={ $_.ProcessId}},
 'UserName'
 @{l='ProcessName';e={ $_.ProcessName}}
)
Get-WmiObject Win32_Process | % { $_ | 
    Add-Member -MemberType ScriptProperty -Name UserName -Value {
        '{0}\{1}' -f $this.GetOwner().Domain,$this.GetOwner().User
    } -Force -PassThru
} | ? UserName -match $env:USERNAME | ft $View -AutoSize

希望有所帮助