문제

I am trying to attach ActionBar Tabs to respect fragment, But it is not working. I don't no where i am getting wrong.

Here is my FragmentActivity

   public class MainActivity extends FragmentActivity implements TabListener {

    String cPlusPlusFrag = "CPP", javaFrag = "Java";

    CPlusPlusFragment cPlusPlusFragment;
    JavaFragment javaFragment;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ActionBar mAction = getActionBar();
        mAction.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

        createTab(mAction, cPlusPlusFrag);
        createTab(mAction, javaFrag);
    }

    public void createTab(ActionBar mActionBar, String tabName) {
        Tab tab = mActionBar.newTab();
        tab.setText(tabName);
        tab.setTabListener(this);
        mActionBar.addTab(tab);
    }

    @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 void onTabReselected(Tab tab, FragmentTransaction ft) {
        Toast.makeText(this, tab.getText() + "Re-Selected", Toast.LENGTH_LONG)
                .show();
    }

    @Override
    public void onTabSelected(Tab tab, FragmentTransaction ft) {
        if (cPlusPlusFrag.equals(tab.getText())) {
            if (cPlusPlusFragment == null) {            
                cPlusPlusFragment = new CPlusPlusFragment();                
                ft.add(android.R.id.content, cPlusPlusFragment);                
            }
        } else if (javaFrag.equals(tab.getText())) {
            if (javaFragment == null) {
                javaFragment = new JavaFragment();  
                ft.add(android.R.id.content, javaFragment);     
            } 
        }
    }

    @Override
    public void onTabUnselected(Tab tab, FragmentTransaction ft) {
        Toast.makeText(this, tab.getText() + " Un-Selected", Toast.LENGTH_LONG)
                .show();
        if (cPlusPlusFrag.equals(tab.getText().toString())) {
            ft.detach(cPlusPlusFragment);
        } else if (javaFrag.equals(tab.getText().toString())) {
            ft.detach(javaFragment);
        }
    }

}

Java Fragment code.

public class JavaFragment extends Fragment {
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View viewToInflate = inflater.inflate(R.layout.java_frag_layout,
                container);
        return viewToInflate;
    };
}

C++ Fragment code.

public class CPlusPlusFragment extends Fragment {
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            View viewToInflate = inflater.inflate(R.layout.cplusplus_frag_layout,
                    container);     

            return viewToInflate;
        }
    }
도움이 되었습니까?

해결책

The Problem is in

methods: onTabSelected, onTabUnSelected

and variables: cPlusPlusFragment and javaFrag (You did not Declared/Created them anywhere)

*Solution*

// The following variables are at Class level (data members)
String cPlusPlusFragment = "C++";
String javaFrag = "Java"

// Pass them in the method createTab accordingly
createTab(mActionBar, cPlusPlusFragment);
createTab(mActionBar, javaFrag);

// Modify you onTabSelected and onTabUnselected methods as follows:

@Override
    public void onTabSelected(Tab tab, FragmentTransaction ft) {
        if (cPlusPlusFrag.equals(tab.getText().toString)) {
            if (cPlusPlusFragment == null) {
                cPlusPlusFragment = new CPlusPlusFragment();

                // No need to Create custom FragmentTransaction, use 
                // one that is passed in the argument

                 ft.add(android.R.id.content, cPlusPlusFragment);
            } else {
                ft.attach(cPlusPlusFragment);
            }

        } else if (javaFrag.equals(tab.getText().toString)) {
            if (javaFragment == null) {
                javaFragment = new JavaFragment();
                ft.add(android.R.id.content, javaFragment);
            } else {
                ft.attach(javaFragment);
            }
        }
    }

    @Override
    public void onTabUnselected(Tab tab, FragmentTransaction ft) {
        Toast.makeText(this, tab.getText() + " Un-Selected", Toast.LENGTH_LONG)
                .show();
        if (cPlusPlusFrag.equals(tab.getText().toString)) {
            ft.detach(cPlusPlusFragment);
        } else if (javaFrag.equals(tab.getText().toString)) {
            ft.detach(javaFragment);
        }
    }

I am 100 % sure that this will solve your problem :)

다른 팁

I see nothing wrong in you code at first sight apart from the fact that you are not commiting your fragment changes.

EveryTime you call to getFragmentManager().beginTransaction(). you have to call .commit() at the end of the line like this:

getFragmentManager().beginTransaction().replace(R.id.main_layout, javaFragment).commit();

Hope it helps :)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top