片段未附加到相应的片段

Posted

技术标签:

【中文标题】片段未附加到相应的片段【英文标题】:Fragment is not attaching to respective fragment 【发布时间】:2014-03-06 15:31:47 【问题描述】:

我正在尝试附加ActionBar Tabs 以尊重片段,但它不起作用。我不知道我哪里错了。

这是我的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 片段代码。

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++ 片段代码。

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;
        
    

【问题讨论】:

你的 minSDK 版本是多少? 你没有根据我的回答更新你的代码! @Shajeel Afzal MinSDK 是 11。 【参考方案1】:

问题出在

方法: onTabSelected, onTabUnSelected

和变量: cPlusPlusFragmentjavaFrag(你没有在任何地方声明/创建它们)

*解决方案*

// 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);
        
    

我 100% 确定这会解决您的问题 :)

【讨论】:

我已经用完整和更新的代码更新了我的帖子。【参考方案2】:

除了您没有提交片段更改这一事实之外,我乍一看您的代码没有任何问题。

每次调用getFragmentManager().beginTransaction(). 时,都必须在行尾调用.commit(),如下所示:

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

希望对你有帮助:)

【讨论】:

以上是关于片段未附加到相应的片段的主要内容,如果未能解决你的问题,请参考以下文章

片段未附加到上下文

片段未附加到我的活动

片段 MyFragment 未附加到 Activity

android 兼容性包 - 片段...未附加到 Activity

java.lang.IllegalStateException:片段未附加到活动

片段未附加到上下文 - 延迟的 UI 更改