【问题标题】:how to get the content fragment at onTabChanged(String tabTag)如何在 onTabChanged(String tabTag) 处获取内容片段
【发布时间】:2015-08-10 20:56:31
【问题描述】:

搜索并看到了一些类似问题的帖子,但没有有效的解决方案。 在这里发帖看看有没有人解决。

在片段中有 FragmentTabHost,并尝试获取当前选项卡的内容片段。

在 mTab​​Host.setOnTabChangedListener 的 onTabChanged(String tabTag) frgmt = getChildFragmentManager().findFragmentByTag(tabTag);返回 null。

mTabHost.setOnTabChangedListener(new TabHost.OnTabChangeListener() {
        @Override
        public void onTabChanged(String tabTag) {

            Fragment frgmt = getChildFragmentManager().findFragmentByTag(tabTag);

        }
    });

在 FragmentTabHost 中,它的 onTabChanged() 调用 doTabChanged() 实例化内容片段并使用 FragmentTransaction 添加,或者如果片段存在则附加到它。

我猜想当 FragmentTabHost::onTabChanged() 调用监听器的 onTabChanged() 时,getChildFragmentManager() 在 FragmentManager 中还没有准备好片段。

有没有办法从 FragmentTabHost 获取 mLastTab?它应该有当前的内容片段。

感谢您的帮助!

@Override
public void onTabChanged(String tabId) {
    if (mAttached) {
        FragmentTransaction ft = doTabChanged(tabId, null);
        if (ft != null) {
            ft.commit();
        }
    }
    if (mOnTabChangeListener != null) {
        mOnTabChangeListener.onTabChanged(tabId);
    }
}

private FragmentTransaction doTabChanged(String tabId, FragmentTransaction ft) {
    TabInfo newTab = null;
    for (int i=0; i<mTabs.size(); i++) {
        TabInfo tab = mTabs.get(i);
        if (tab.tag.equals(tabId)) {
            newTab = tab;
        }
    }
    if (newTab == null) {
        throw new IllegalStateException("No tab known for tag " + tabId);
    }
    if (mLastTab != newTab) {
        if (ft == null) {
            ft = mFragmentManager.beginTransaction();
        }
        if (mLastTab != null) {
            if (mLastTab.fragment != null) {
                ft.detach(mLastTab.fragment);
            }
        }
        if (newTab != null) {
            if (newTab.fragment == null) {
                newTab.fragment = Fragment.instantiate(mContext,
                        newTab.clss.getName(), newTab.args);
                ft.add(mContainerId, newTab.fragment, newTab.tag);
            } else {
                ft.attach(newTab.fragment);
            }
        }

        mLastTab = newTab;
    }
    return ft;
}

【问题讨论】:

    标签: android android-fragments fragment-tab-host


    【解决方案1】:

    你可以看到的问题是 OntabChanged() 中的 ft.commit ,然后我们调用

    if (mOnTabChangeListener != null) {
        mOnTabChangeListener.onTabChanged(tabId);
    }
    

    标签片段仍未创建,因此当我们尝试在 OnTabChnad 回调中获取 Tabfragement 的实例时抛出空指针异常。

    我的解决方案: we should use the way two fragments communicate with each other using activity.

    这里是活动

    public class MainActivity extends ActionBarActivity implements OnHeadlineSelectedListener{
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    
    
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }
    
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
    
        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }
    
        return super.onOptionsItemSelected(item);
    }
    
    @Override
    public void OnTabCompletelyChanged(String tag) {
        ((MainActivityFragment)getSupportFragmentManager().findFragmentById(R.id.fragment)).OnTabChanged(tag);
    
    }
    

    }

    MainFragment 持有标签

    public class MainActivityFragment extends Fragment {
    private FragmentTabHost mTabHost;
    private FragmentTab tab;
    public MainActivityFragment() {
    }
    
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_main, container, false);
    
        mTabHost = (FragmentTabHost) v.findViewById(android.R.id.tabhost);
        mTabHost.setup(getActivity(), getChildFragmentManager(), android.R.id.tabcontent);
    
        mTabHost.addTab(
                mTabHost.newTabSpec("tab1").setIndicator("Tab 1", null),
                FragmentTab.class, null);
        mTabHost.addTab(
                mTabHost.newTabSpec("tab2").setIndicator("Tab 2", null),
                FragmentTab.class, null);
        mTabHost.addTab(
                mTabHost.newTabSpec("tab3").setIndicator("Tab 3", null),
                FragmentTab.class, null);
    
        return v;
    }
    
    
    public void OnTabChanged(String tag) {
        tab = (FragmentTab)getChildFragmentManager().findFragmentByTag(tag); // Not null
    }
    

    }

    片段标签:

    public class FragmentTab extends Fragment {
    
    private OnHeadlineSelectedListener mCallback;
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }
    
    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
    
        // This makes sure that the container activity has implemented
        // the callback interface. If not, it throws an exception
        try {
            mCallback = (OnHeadlineSelectedListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString()
                    + " must implement OnHeadlineSelectedListener");
        }
    }
    
    @Override
    public void onStart() {
        super.onStart();
        mCallback.OnTabCompletelyChanged(this.getTag());
    }
    
    public String getString(){
        return "hello";
    }
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_layout, container, false);
        TextView tv = (TextView) v.findViewById(R.id.text);
        tv.setText(this.getTag() + " Content");
        return v;
    }}
    

    【讨论】:

      【解决方案2】:

      你应该尝试这样的事情:- FragmentManager mFragmentManager = getActivity().getSupportFragmentManager();

      希望对你有帮助

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-11-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多