更改FrameLayout和选项卡式导航中的碎片不起作用

时间:2013-07-03 19:18:26

标签: java android android-actionbar

我正在尝试在操作栏中设置标签式导航。点击选项卡时,frameLayout应更改为该活动中4个可能的片段之一。

然而,它被困在第一个片段中,当我点击标签时,没有任何反应。关于可能出错的任何想法?我怀疑我在处理标签的监听器方面做错了什么,但我无法弄清楚(非常令人沮丧)。有帮助吗?提前谢谢。

Form.java(主要应用程序)

package com.example.ehistory;

import android.annotation.SuppressLint;
import android.app.ActionBar;
import android.app.ActionBar.Tab;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentTransaction;
import android.view.Menu;
import android.view.MenuItem;

@SuppressLint("NewApi")
public class Form extends FragmentActivity {

    @SuppressLint("NewApi")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_form1);

        ActionBar actionBar = getActionBar();

        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

        actionBar.setDisplayShowHomeEnabled(true);
        actionBar.setDisplayShowTitleEnabled(false);

        Tab tab = actionBar.newTab()
                //.setText(R.string.anamnesis)
                .setIcon(R.drawable.id)
                .setTabListener(new TabListener<Frag1>(
                        this, "anamnesis", Frag1.class));
        actionBar.addTab(tab);

        tab = actionBar.newTab()
            //.setText(R.string.symptom)
            .setIcon(R.drawable.current)
            .setTabListener(new TabListener<Frag2>(
                    this, "symptom", Frag2.class));
        actionBar.addTab(tab);

        tab = actionBar.newTab()
                //.setText(R.string.otherhistory)
                .setIcon(R.drawable.past)
                .setTabListener(new TabListener<Frag3>(
                        this, "otherhistory", Frag3.class));
            actionBar.addTab(tab);

        tab = actionBar.newTab()
                 //.setText(R.string.ros)
                 .setIcon(R.drawable.ros)
                 .setTabListener(new TabListener<Frag4>(
                        this, "ros", Frag4.class));
            actionBar.addTab(tab);

            if (findViewById(R.id.fragment_container) != null) {

            // However, if we're being restored from a previous state,
            // then we don't need to do anything and should return or else
            // we could end up with overlapping fragments.
            if (savedInstanceState != null) {
                return;
            }

            // Create an instance of ExampleFragment
            Frag1 firstFragment = new Frag1();

            // In case this activity was started with special instructions from an Intent,
            // pass the Intent's extras to the fragment as arguments
            firstFragment.setArguments(getIntent().getExtras());

            // Add the fragment to the 'fragment_container' FrameLayout
            getSupportFragmentManager().beginTransaction()
                    .add(R.id.fragment_container, firstFragment).commit();
        }

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            //don't forget are you sure you don't want to save bullshit
            case R.id.newpatient:
                Intent intent = new Intent(Form.this, Form.class);
                Form.this.startActivity(intent);
            default: break;
        }
        return true;
    }

    public static class TabListener<T extends Fragment> implements ActionBar.TabListener {
        private Fragment mFragment;
        private final Activity mActivity;
        private final String mTag;
        private final Class<T> mClass;

        /** Constructor used each time a new tab is created.
          * @param activity  The host Activity, used to instantiate the fragment
          * @param tag  The identifier tag for the fragment
          * @param clz  The fragment's Class, used to instantiate the fragment
          */
        public TabListener(Activity activity, String tag, Class<T> clz) {
            mActivity = activity;
            mTag = tag;
            mClass = clz;
        }

        /* The following are each of the ActionBar.TabListener callbacks */

        public void onTabSelected(Tab tab, FragmentTransaction ft) {
            // Check if the fragment is already initialized
            if (mFragment == null) {
                // If not, instantiate and add it to the activity
                mFragment = Fragment.instantiate(mActivity, mClass.getName());
                ft.replace(R.id.fragment_container, mFragment, mTag);
                ft.commit();
            } else {
                // If it exists, simply attach it in order to show it
                ft.attach(mFragment);
            }

        }

        public void onTabUnselected(Tab tab, FragmentTransaction ft) {
            if (mFragment != null) {
                // Detach the fragment, because another one is being attached
                ft.detach(mFragment);
            }
        }

        public void onTabReselected(Tab tab, FragmentTransaction ft) {
            // User selected the already selected tab. Usually do nothing.
        }

        @Override
        public void onTabReselected(Tab arg0,
                android.app.FragmentTransaction arg1) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onTabSelected(Tab arg0, android.app.FragmentTransaction arg1) {
            // TODO Auto-generated method stub


        }

        @Override
        public void onTabUnselected(Tab arg0,
                android.app.FragmentTransaction arg1) {
            // TODO Auto-generated method stub

        }
    }

}

Frag1.java(其中一个片段)

package com.example.ehistory;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.Spinner;

public class Frag1 extends Fragment {

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

        Spinner spinner = (Spinner) v.findViewById(R.id.gender_spin);
        ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this.getActivity(),
                R.array.genders, android.R.layout.simple_spinner_item);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner.setAdapter(adapter);

        AutoCompleteTextView textView = (AutoCompleteTextView) v.findViewById(R.id.ethnicity_edit);
        String[] ethnicities = getResources().getStringArray(R.array.ethnicity_array);
        ArrayAdapter<String> adapter_auto = 
                new ArrayAdapter<String>(this.getActivity(), android.R.layout.simple_list_item_1, ethnicities);
        textView.setAdapter(adapter_auto);

        AutoCompleteTextView textView1 = (AutoCompleteTextView) v.findViewById(R.id.nationality_edit);
        String[] nationalities = getResources().getStringArray(R.array.nationality_array);
        ArrayAdapter<String> adapter_auto1 = 
                new ArrayAdapter<String>(this.getActivity(), android.R.layout.simple_list_item_1, nationalities);
        textView1.setAdapter(adapter_auto1);

        Spinner spinner1 = (Spinner) v.findViewById(R.id.leg_spin);
        ArrayAdapter<CharSequence> adapter1 = ArrayAdapter.createFromResource(this.getActivity(),
                R.array.legal_status, android.R.layout.simple_spinner_item);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner1.setAdapter(adapter1);

        AutoCompleteTextView textView2 = (AutoCompleteTextView) v.findViewById(R.id.religion_edit);
        String[] religions = getResources().getStringArray(R.array.religions);
        ArrayAdapter<String> adapter_auto2 = 
                new ArrayAdapter<String>(this.getActivity(), android.R.layout.simple_list_item_1, religions);
        textView2.setAdapter(adapter_auto2);

        return v;
    }

}

1 个答案:

答案 0 :(得分:1)

为什么不使用导航到标签的ViewPager? Android Developer网站提供了关于Creating Swipe Views with Tabs的优秀教程。