【问题标题】:Sliding Tabs - Android滑动标签 - Android
【发布时间】:2014-10-06 23:32:07
【问题描述】:

我正在创造某种星座。我有一个包含所有星座的片段,所以当用户点击一个星座时,我会将该星座名称发送到 Web 服务,并且我会获取包含该星座星座内容的 JSON。此内容分为 4 个部分:每日、每周、每月和每年。为此,我创建了 4 个选项卡并使用来自 JSON 的内容进行归档。 但问题是当我回到所有星座时,4 个标签仍然存在。我不想显示标签。所以我需要以某种方式隐藏这 4 个选项卡,并在用户单击另一个(或相同)星座时再次显示它们。此外,当我单击另一个标志时,会创建 4 个新选项卡,但使用旧的通过标志,而不是新的。而且有时候整屏都是白的,没有内容。这是我的全部代码:

FragmentHoroscopePage.java(所有星座的片段):

public class FragmentHoroscopePage extends Fragment implements OnClickListener {

    private FragmentItemHoroscopePage itemHoroscope;
    private FragmentManager manager;
    private FragmentTransaction transaction;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_horoscope, container, false);
        Log.d("FRAGMENT", "FragmentHoroscope");

        manager = getFragmentManager();

        ImageView ivOven = (ImageView) view.findViewById(R.id.ivOven);
        ImageView ivBik = (ImageView) view.findViewById(R.id.ivBik);
        ImageView ivBliznaci = (ImageView) view.findViewById(R.id.ivBliznaci);

        ImageView ivRak = (ImageView) view.findViewById(R.id.ivRak);
        ImageView ivLav = (ImageView) view.findViewById(R.id.ivLav);
        ImageView ivDevica = (ImageView) view.findViewById(R.id.ivDevica);

        ImageView ivVaga = (ImageView) view.findViewById(R.id.ivVaga);
        ImageView ivSkorpija = (ImageView) view.findViewById(R.id.ivSkorpija);
        ImageView ivStrelec = (ImageView) view.findViewById(R.id.ivStrelec);

        ImageView ivJarec = (ImageView) view.findViewById(R.id.ivJarec);
        ImageView ivVodolija = (ImageView) view.findViewById(R.id.ivVodolija);
        ImageView ivRibi = (ImageView) view.findViewById(R.id.ivRibi);

        ivOven.setOnClickListener(this);
        ivBik.setOnClickListener(this);
        ivBliznaci.setOnClickListener(this);

        ivRak.setOnClickListener(this);
        ivLav.setOnClickListener(this);
        ivDevica.setOnClickListener(this);

        ivVaga.setOnClickListener(this);
        ivSkorpija.setOnClickListener(this);
        ivStrelec.setOnClickListener(this);

        ivJarec.setOnClickListener(this);
        ivVodolija.setOnClickListener(this);
        ivRibi.setOnClickListener(this);

        return view;
    }

    @Override
    public void onClick(View v) {

        itemHoroscope = new FragmentItemHoroscopePage();
        transaction = manager.beginTransaction();
        Bundle bundle = new Bundle();
        String sign = null;

        switch(v.getId()) {

        case R.id.ivOven:
            sign = "oven";
            break;
        case R.id.ivBik:
            sign = "bik";
            break;
        case R.id.ivBliznaci:
            sign = "bliznaci";
            break;

        case R.id.ivRak:
            sign = "rak";
            break;
        case R.id.ivLav:
            sign = "lav";
            break;
        case R.id.ivDevica:
            sign = "devica";
            break;

        case R.id.ivVaga:
            sign = "vaga";
            break;
        case R.id.ivSkorpija:
            sign = "skorpija";
            break;
        case R.id.ivStrelec:
            sign = "strelec";
            break;

        case R.id.ivJarec:
            sign = "jarec";
            break;
        case R.id.ivVodolija:
            sign = "vodilija";
            break;
        case R.id.ivRibi:
            sign = "ribi";
            break;
        }

        bundle.putString("horoscope_sign", sign);
        itemHoroscope.setArguments(bundle);
        transaction.replace(R.id.mainContainer, itemHoroscope, "ItemHoroscopePage");
        transaction.addToBackStack("ItemHoroscopePage");
        transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
        transaction.commit();
    }
}

FragmentItemHoroscopePage.java - 我在这里创建了 4 个选项卡,ViewPager 和适配器

public class FragmentItemHoroscopePage extends Fragment implements TabListener {

    private ActionBar actionBar;
    private ViewPager viewPager;

    private String sign;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.item_layout_horoscope, container, false);
        Log.d("FRAGMENT", "FragmentItemHoroscope");

        actionBar = getActivity().getActionBar();
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

        FragmentManager manager = getFragmentManager();

        sign = getArguments().getString("horoscope_sign");

        viewPager = (ViewPager) view.findViewById(R.id.pager);

        viewPager.setAdapter(new MyAdapter(manager));
        viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageSelected(int i) {
                actionBar.setSelectedNavigationItem(i);
            }

            @Override
            public void onPageScrolled(int i, float from, int pix) { }
            @Override
            public void onPageScrollStateChanged(int i) { }
        });

        actionBar.addTab(actionBar.newTab().setText(R.string.dneven).setTabListener(this));
        actionBar.addTab(actionBar.newTab().setText(R.string.nedelen).setTabListener(this));
        actionBar.addTab(actionBar.newTab().setText(R.string.mesecen).setTabListener(this));
        actionBar.addTab(actionBar.newTab().setText(R.string.godisen).setTabListener(this));

        return view;
    }

    @Override
    public void onTabSelected(Tab tab, FragmentTransaction ft) {
        viewPager.setCurrentItem(tab.getPosition());
    }

    @Override
    public void onTabReselected(Tab tab, FragmentTransaction ft) { }
    @Override
    public void onTabUnselected(Tab tab, FragmentTransaction ft) { }

    class MyAdapter extends FragmentPagerAdapter {

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

        @Override
        public Fragment getItem(int i) {

            Bundle bundle = new Bundle();
            bundle.putString("horoscope_sign", sign);
            Fragment fragment = null;

            switch (i) {
            case 0:
                fragment = new FragmentDaily();
                break;

            case 1:
                fragment = new FragmentWeekly();
                break;

            case 2:
                fragment = new FragmentMonthly();
                break;

            case 3:
                fragment = new FragmentYearly();
                break;
            }

            fragment.setArguments(bundle);
            return fragment;
        }

        @Override
        public int getCount() { return 4; }
    }
}

FragmentDaily.java - 四个选项卡之一,其他选项卡相同,但内容不同。在这里,我得到了传递的 horoscope_sign,并在 AsyncTask 中向 Web 服务发送 POST 请求,并获取 JSON。任务完成后,我正在创建第一个标签的内容(标签每日)

public class FragmentDaily extends Fragment {

    private Context context;
    private ItemDaily itemDaily;

    private ImageView ivZnak;
    private TextView tvZnak;
    private TextView tvDay;
    private TextView tvText;

    private FragmentManager manager;
    private FragmentTransaction transaction;
    private Bundle bundle;
    private FragmentItemHoroscopePage itemHoroscopePage;

    private List<NameValuePair> pair;
    private String horoscope_sign;

    private String[] znak = new String[12];

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_dneven, container, false);
        Log.d("HOROSCOPE FRAGMENT", "FragmentDaily");

        context = getActivity();
        manager = getFragmentManager();
        bundle = new Bundle();
        itemHoroscopePage = new FragmentItemHoroscopePage();

        znak = context.getResources().getStringArray(R.array.horoscope);

        horoscope_sign = getArguments().getString("horoscope_sign");
        pair = new ArrayList<NameValuePair>();
        pair.add(new BasicNameValuePair("horoscope_sign", horoscope_sign));

        System.out.println("UNUTRA" + horoscope_sign);

        new GetHoroscopeTask().execute();

        ivZnak = (ImageView) view.findViewById(R.id.ivDailyZnak);
        tvZnak = (TextView) view.findViewById(R.id.tvDailyZnak);

        tvDay = (TextView) view.findViewById(R.id.tvDailyDay);
        tvText = (TextView) view.findViewById(R.id.tvDailyText);

        return view;
    }

    class GetHoroscopeTask extends AsyncTask<String, Void, Boolean> {

        private ProgressDialog dialog;

        @Override
        protected void onPreExecute() {
            super.onPreExecute();

            dialog = new ProgressDialog(context);
            dialog.setMessage("Please wait, Colecting data!");
            dialog.setCancelable(false);
            dialog.show();
        }

        @Override
        protected Boolean doInBackground(String... params) {

            try {
                DefaultHttpClient httpClient = new DefaultHttpClient();
                HttpPost httpPost = new HttpPost(Variables.URL_HOROSCOPE);
                httpPost.setEntity(new UrlEncodedFormEntity(pair));

                HttpResponse httpResponse = httpClient.execute(httpPost);
                HttpEntity httpEntity = httpResponse.getEntity();
                String data = EntityUtils.toString(httpEntity);

                int status = httpResponse.getStatusLine().getStatusCode();

                if (status == HttpStatus.SC_OK) {

                    itemDaily = new ItemDaily();

                    JSONObject jObject = new JSONObject(data);
                    JSONObject jRealObject = jObject.getJSONObject("daily");

                    itemDaily.setText(jRealObject.getString("text").toString());
                    itemDaily.setDay(jRealObject.getString("day").toString());

                    return true;

                } else {
                    Toast.makeText(context, Variables.ERROR_MESSAGE, Toast.LENGTH_LONG).show();
                    ((Activity) context).finish();
                }
            } catch (ClientProtocolException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (JSONException e) {
                e.printStackTrace();
            }

            return false;
        }

        @Override
        protected void onPostExecute(Boolean result) {

            if(result == false) {
                Toast.makeText(context, Variables.ERROR_MESSAGE, Toast.LENGTH_LONG).show();
            } else {
                if(dialog.isShowing()) {
                    dialog.dismiss();
                }

                tvDay.setText(getResources().getString(R.string.dneven_horoskop) + " " + itemDaily.getDay());
                tvText.setText(Html.fromHtml(itemDaily.getText()));
            }
        }
    }
}

【问题讨论】:

    标签: android json tabs android-viewpager android-tabs


    【解决方案1】:

    然后创建一个新意图。只是不要完成();在选项卡活动中。如果你想再次进入标签,只需调用 finish();

    【讨论】:

    • 但我使用的是片段,而不是活动
    • 一个片段仍然可以调用intent,但是如果你真的不想使用正常的活动,那么也许你应该为星座做一个导航抽屉。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多