как получить фрагмент содержимого в onTabChanged(String tabTag)

Искал и видел несколько сообщений по аналогичному вопросу, но не нашел рабочего решения. Напишите сюда, чтобы узнать, решил ли кто-то это.

Наличие FragmentTabHost во фрагменте и попытка получить фрагмент содержимого текущей вкладки.

в mTabHost.setOnTabChangedListener onTabChanged(String tabTag) frgmt = getChildFragmentManager().findFragmentByTag(tabTag); возвращает ноль.

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

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

        }
    });

В FragmentTabHost его onTabChanged() вызывает doTabChanged(), который создает экземпляр фрагмента содержимого и добавляет его с помощью FragmentTransaction или присоединяется к нему, если фрагмент существует.

Я предполагаю, что когда FragmentTabHost::onTabChanged() вызывает onTabChanged() слушателя, фрагмент все еще не готов в FragmentManager с помощью getChildFragmentManager().

Есть ли способ получить mLastTab из FragmentTabHost? Он должен иметь текущий фрагмент контента.

Спасибо за помощь!

@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;
}

person lannyf    schedule 18.05.2015    source источник


Ответы (2)


Проблема, как вы можете видеть, заключается в ft.commit в OntabChanged(), а затем мы вызываем

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

фрагмент вкладки все еще не создан, поэтому выдает исключение нулевого указателя, когда мы пытаемся получить экземпляр Tabfragement внутри обратного вызова OnTabChnaged.

Мое решение: мы должны использовать способ, которым два фрагмента взаимодействуют друг с другом, используя активность.

Вот активность

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;
}}
person anshul    schedule 10.08.2015

Вы должны попробовать что-то вроде этого: - FragmentManager mFragmentManager = getActivity().getSupportFragmentManager();

Я надеюсь, что это может помочь вам

person pRaNaY    schedule 15.06.2015