具有相同片段的Android标签

时间:2015-07-03 11:21:02

标签: java android android-fragments

我正在尝试实施Tabs。选项卡将包含完全相同的布局和相同的片段,只有一个区别 - API URL! (例如趋势/最新)。 我的代码:

TabFragment

public class TabFragments extends Fragment implements OnPageChangeListener,
        OnTabChangeListener {


    private TabHost tabHost;
    private int currentTab = 0;
    private ViewPager viewPager;
    private TabFragmentPageAdapter pageAdapter;
    private List<Fragment> fragments;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.tabhost, null);
        tabHost = (TabHost) rootView.findViewById(android.R.id.tabhost);
        viewPager = (ViewPager) rootView.findViewById(R.id.viewpager);
        viewPager.setOnPageChangeListener(this);

        //Create correct fragment
        fragments=new ArrayList<>();
        fragments.add(new ItemStreamFragment());
        fragments.add(new ItemStreamFragment());

        return rootView;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        setRetainInstance(true);
        pageAdapter = new TabFragmentPageAdapter(getChildFragmentManager(),
                fragments);
        pageAdapter.notifyDataSetChanged();
        viewPager.setAdapter(pageAdapter);
        setupTabs();

    }

    private void setupTabs() {
        tabHost.setup();
        tabHost.addTab(newTab(R.string.tab_1_item));
        tabHost.addTab(newTab(R.string.tab_2_item));

        for (int i = 0; i < tabHost.getTabWidget().getChildCount(); i++) {

            tabHost.getTabWidget().getChildAt(i)
                    .setBackgroundColor(Color.parseColor("#304c58"));

            // tabHost.setBackgroundResource(R.drawable.tab_selector);
            final View view = tabHost.getTabWidget().getChildTabViewAt(i);
            final View textView = view.findViewById(android.R.id.title);
            ((TextView) textView).setTextColor(Color.parseColor("#e2ebf0"));

            ((TextView) textView).setSingleLine(true);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
                tabHost.getTabWidget().getChildAt(i)
                        .findViewById(android.R.id.icon);
                tabHost.getTabWidget().getChildAt(i).getLayoutParams().height = 75;

            } else {

                if (view != null) {
                    // reduce height of the tab
                    view.getLayoutParams().height *= 0.77;

                    if (textView instanceof TextView) {
                        ((TextView) textView).setGravity(Gravity.CENTER);
                        textView.getLayoutParams().height = ViewGroup.LayoutParams.MATCH_PARENT;
                        textView.getLayoutParams().width = ViewGroup.LayoutParams.WRAP_CONTENT;
                    }
                }
            }

        }
        tabHost.setOnTabChangedListener(TabFragments.this);
        tabHost.setCurrentTab(currentTab);
    }

    private TabSpec newTab(int titleId) {
        TabSpec tabSpec = tabHost.newTabSpec(getString(titleId));
        tabSpec.setIndicator(getString(titleId));
        tabSpec.setContent(new TabFactory(getActivity()));
        return tabSpec;
    }

    @Override
    public void onPageScrollStateChanged(int position) {

    }

    @Override
    public void onPageScrolled(int position, float arg1, int arg2) {

    }

    @Override
    public void onPageSelected(int position) {
        tabHost.setCurrentTab(position);
    }

    @Override
    public void onTabChanged(String tabId) {
        currentTab = tabHost.getCurrentTab();
        viewPager.setCurrentItem(currentTab);
    }

    @SuppressWarnings("unused")
    private void updateTab() {
        switch (currentTab) {
            case 0:
                ItemStreamFragment login = (ItemStreamFragment) fragments.get(currentTab);
                break;
            case 1:
                ItemStreamFragment register = (ItemStreamFragment) fragments
                        .get(currentTab);
                break;
        }
    }

    class TabFactory implements TabContentFactory {

        private final Context context;

        public TabFactory(Context context) {
            this.context = context;
        }

        @Override
        public View createTabContent(String tag) {
            View v = new View(context);
            v.setMinimumHeight(0);
            v.setMinimumWidth(0);
            return v;
        }

    }
}

TabFragmentPageAdapter

public class TabFragmentPageAdapter extends FragmentPagerAdapter {
    private List<Fragment> fragments;

    public TabFragmentPageAdapter(FragmentManager fm, List<Fragment> fragments
    ) {
        super(fm);
        this.fragments = fragments;
    }

    @Override
    public Fragment getItem(int position) {
        Fragment fragment = fragments.get(position);
        Bundle args = new Bundle();
        args.putInt("position", position);
        fragment.setArguments(args);
        return fragment;
    }

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

    @Override
    public int getItemPosition(Object object) {
        return POSITION_NONE;
    }
}

最后是ItemStreamFragment

public class ItemStreamFragment extends Fragment {

    private String mApiUrl = "http://api.eese.com:8080/ICDS_API/v1/reco.getNewest/?page=0&limit=13&timestamp=2015-07-02+10%3A34%3A07&lang_key=en";
    private final String mImages = "http://d30q95ofpjr96w.cloudfront.net/";
    private ItemStream[] mObjectItem;
    private int mPosition = 0;
    public ItemStreamAdapter mAdapter;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Bundle bundle = getArguments();
        if (bundle != null) {
            mPosition = bundle.getInt("position", 0);
        }
    }


    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        super.onCreateOptionsMenu(menu, inflater);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_itemstream, container, false);
        view.setId(mPosition);
        getStream(mPosition);
        return view;
    }

    private void getStream(int position) {
        switchUrl(position);
        new GetRequestTask(new OnTaskCompleted() {
            @Override
            public void onTaskCompleted(String result) {
                try {
                    JSONObject jsonObject = new JSONObject(result);
                    JSONArray jsonResults = jsonObject.getJSONArray("results");

                    final int resultLength = jsonResults.length();
                    mObjectItem = new ItemStream[resultLength];
                    for (int i = 0; i < resultLength; i++) {
                        JSONObject item = jsonResults.getJSONObject(i);
                        mObjectItem[i] = new ItemStream(item.getInt("id"), item.getString("title"), mImages + "" + item.getString("thumbnail") + ".374x210." + item.getString("thumbnail_type"));
                    }
                    if (getActivity() != null) {
                        mAdapter = new ItemStreamAdapter(getActivity(), R.layout.list_itemstream, mObjectItem);
                        ListView scrollView = (ListView) getActivity().findViewById(R.id.itemstream_trend);
                        scrollView.setAdapter(mAdapter);
                    }
                } catch (Exception ex) {
                }
            }
        }).execute(mApiUrl);
    }

    //Needs to be tuned
    private void switchUrl(int position) {
        switch (position) {
            case 0:
                mApiUrl = "http://api.eese.com:8080/ICDS_API/v1/reco.getTrending/?page=0&limit=13&timestamp=2015-07-02+10%3A34%3A07&lang_key=en";
                break;
            case 1:
                mApiUrl = "http://api.eese.com:8080/ICDS_API/v1/reco.getNewest/?page=0&limit=13&timestamp=2015-07-02+10%3A34%3A07&lang_key=en";
                break;
        }
    }
}

在这里你看到会发生什么: enter image description here enter image description here

(Sry for overlay :))

问题是第一个Tab加载了数据但第二​​个标签保持为空(尽管它不应该是空的)。不知道这里有什么问题。如果你能指出我正确的方向会很酷:)

2 个答案:

答案 0 :(得分:1)

要在材料设计中使用标签,您应该使用设计支持库中的TabLayout。以下是tutorial,您可以从中学习这种新方法。

就加载片段而言,第二个片段将首先加载,这是与viewpager完全不同的讨论,因此您需要为每个片段使用不同的url,并且不要使用新的Operator创建片段。而是在Fragment类中创建静态getInstance()并从那里传递url并使用Fragment #setArgument(Bundle)获取新的Fragment实例。当创建片段视图时,即onViewCreated(...)从您的案例中的bundle获取参数String url并调用webservice,它将返回相应的响应。

答案 1 :(得分:0)

解决了问题:

  @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_itemstream, container, false);
        view.setId(mPosition);
        getStream(mPosition,view);
        return view;
    }

    private void getStream(int position, final View view) {
        switchUrl(position);
        new GetRequestTask(new OnTaskCompleted() {
            @Override
            public void onTaskCompleted(String result) {
                try {
                    JSONObject jsonObject = new JSONObject(result);
                    JSONArray jsonResults = jsonObject.getJSONArray("results");

                    final int resultLength = jsonResults.length();
                    mObjectItem = new ItemStream[resultLength];
                    for (int i = 0; i < resultLength; i++) {
                        JSONObject item = jsonResults.getJSONObject(i);
                        mObjectItem[i] = new ItemStream(item.getInt("id"), item.getString("title"), mImages + "" + item.getString("thumbnail") + ".374x210." + item.getString("thumbnail_type"));
                    }

                    if (getActivity() != null) {
                        mAdapter = new ItemStreamAdapter(getActivity(), R.layout.list_itemstream, mObjectItem);
                        ListView scrollView = (ListView) view.findViewById(R.id.itemstream_trend);
                        scrollView.setAdapter(mAdapter);
                    }
                } catch (Exception ex) {
                }
            }
        }).execute(mApiUrl);
    }

刚添加视图getStream方法。现在它正在运作!您对此解决方案有何看法?