Android 如何在onTabChanged(String tabTag)获取内容片段
搜索并看到了一些类似问题的帖子,但没有有效的解决方案。 张贴在这里,看看是否有人已经解决了它 在片段中包含FragmentTabHost,并尝试获取当前选项卡的内容片段 在mTabHost.setOnTabChangedListener的onTabChanged(字符串标签)中 frgmt=getChildFragmentManager().findFragmentByTag(tabTag);返回nullAndroid 如何在onTabChanged(String tabTag)获取内容片段,android,android-fragments,fragment-tab-host,Android,Android Fragments,Fragment Tab Host,搜索并看到了一些类似问题的帖子,但没有有效的解决方案。 张贴在这里,看看是否有人已经解决了它 在片段中包含FragmentTabHost,并尝试获取当前选项卡的内容片段 在mTabHost.setOnTabChangedListener的onTabChanged(字符串标签)中 frgmt=getChildFragmentManager().findFragmentByTag(tabTag);返回null mTabHost.setOnTabChangedListener(new TabHost.
mTabHost.setOnTabChangedListener(new TabHost.OnTabChangeListener() {
@Override
public void onTabChanged(String tabTag) {
Fragment frgmt = getChildFragmentManager().findFragmentByTag(tabTag);
}
});
在FragmentTabHost中,它的onTabChanged()调用doTabChanged(),doTabChanged()实例化内容片段并使用FragmentTransaction添加,如果片段存在,则附加到内容片段
我猜当FragmentTabHost::onTabChanged()调用侦听器的onTabChanged()时,该片段在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;
}
@覆盖
已更改的公共无效项(字符串选项卡ID){
如果(mAttached){
FragmentTransaction ft=doTabChanged(tabId,null);
如果(英尺!=null){
ft.commit();
}
}
如果(mOnTabChangeListener!=null){
mOnTabChangeListener.onTabChanged(tabId);
}
}
私有FragmentTransaction doTabChanged(字符串选项卡ID,FragmentTransaction ft){
TabInfo newTab=null;
对于(int i=0;i您应该尝试以下方法:-
FragmentManager MFFragmentManager=getActivity().getSupportFragmentManager();
我希望它可以帮助您您可以看到的问题是OntabChanged()中的ft.commit,然后我们调用
if (mOnTabChangeListener != null) {
mOnTabChangeListener.onTabChanged(tabId);
}
tab片段仍然没有创建,因此当我们试图在OnTabChnaged回调中获取Tabfragement的实例时,抛出空指针异常
我的解决方案:
这里是活动
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);
}
}
拿着标签的主要碎片
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;
}}