简体   繁体   English

具有相同片段的Android标签

[英]Android Tabs with same Fragment

I'm trying to implement Tabs. 我正在尝试实现Tabs。 The Tabs will contain the exact same layout and the same fragment with only one difference - the API URL! 选项卡将包含完全相同的布局和相同的片段,只有一个不同-API URL! (eg Trending/Newest). (例如趋势/最新)。 My Code: 我的代码:

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

And finally ItemStreamFragment 最后是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;
        }
    }
}

And here you see what happens: 在这里,您会看到发生了什么: 在此处输入图片说明在此处输入图片说明

(Sry for the overlay :) ) (对叠加很抱歉:))

The thing is that the first Tab is loaded with data but the second tab stays empty (it shouldn't be empty though). 事实是,第一个标签页已加载数据,但第二个标签页仍为空(尽管不应为空)。 Not sure what is wrong here. 不知道这里出了什么问题。 Would be cool if you can point me in the right direction :) 如果您能指出正确的方向,那将会很棒:)

For using Tabs in material design you should use TabLayout from design support library. 要在材料设计中使用Tabs,应使用设计支持库中的TabLayout Here is the tutorial from where you can learn this new approach. 这是您可以从中学习这种新方法的教程

As far as loading fragment is concern, you second fragment will be loaded with first this is complete different discussion with viewpager, so you need to have different url for each fragment and don't create fragment using new Operator. 就加载片段而言,第二个片段将首先加载,这是与viewpager完全不同的讨论,因此您需要为每个片段使用不同的url,并且不要使用new Operator创建片段。 Instead create static getInstance() in Fragment class and pass the url from there and using Fragment#setArgument(Bundle) get new Fragment instance. 而是在Fragment类中创建静态getInstance()并从那里传递url,然后使用Fragment#setArgument(Bundle)获取新的Fragment实例。 When fragment view is created ie in onViewCreated(...) get arguments from bundle in your case String url and call webservice which will return the respective response. 当创建片段视图时,即在onViewCreated(...)中,从您的案例中的bundle中获取参数字符串url并调用webservice,它将返回相应的响应。

Fixed the problem: 解决了问题:

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

Just added view to the method getStream. 刚刚将视图添加到方法getStream中。 Now it is working! 现在可以了! What do you think about this solution? 您如何看待该解决方案?

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM