TabLayout + вложенные фрагменты.
-
- Сообщения: 16
- Зарегистрирован: 03 авг 2013, 22:55
TabLayout + вложенные фрагменты.
Добрый день. Использую в приложении TabLayout, ViewPager и FragmentStatePagerAdapter таким образом, чтобы во вкладках TabLayout были фрагменты, и эти фрагменты, в свою очередь, содержат вложенные фрагменты. Возник вопрос: как можно во вложенных фрагментах отследить событие, когда пользователь переключается на кладку, которая содержит фрагмент-родитель вложенных фрагментов? Хочу реализовать механизм, который будет обновлять содержимое вложенных фрагментов каждый раз, когда пользователь переключается на соответствующую вкладку.
Re: TabLayout + вложенные фрагменты.
Здравствуйте! Вы бы код что ли прислали, чтобы разобраться в Вашей проблеме можно было. Как это так Вы смогли сделать, чтобы у фрагментов были свои вложенные фрагменты? Если фрагменты статические, то Вы не сможете их обновлять при свайпе. В этом случае все статические фрагменты каждого таба, при создании активности где вы инициализируете ViewPager и подключаете FragmentStatePagerAdapter к ViewPager, будут создаваться одновременно, даже если вы не видите остальных фрагментов. Поэтому для динамической работы с фрагментами и обновления их содержимого, Вам нужно будет их динамически создавать. А дальнейший ответ будет зависеть от предоставленного Вами кода.varlok3000 писал(а):Добрый день. Использую в приложении TabLayout, ViewPager и FragmentStatePagerAdapter таким образом, чтобы во вкладках TabLayout были фрагменты, и эти фрагменты, в свою очередь, содержат вложенные фрагменты. Возник вопрос: как можно во вложенных фрагментах отследить событие, когда пользователь переключается на кладку, которая содержит фрагмент-родитель вложенных фрагментов? Хочу реализовать механизм, который будет обновлять содержимое вложенных фрагментов каждый раз, когда пользователь переключается на соответствующую вкладку.
-
- Сообщения: 16
- Зарегистрирован: 03 авг 2013, 22:55
Re: TabLayout + вложенные фрагменты.
Вот часть кода. По задумке, во вкладках (табах) будут разные фрагменты , внутри которых будут свои фрагменты (вложенные фрагменты).Здравствуйте! Вы бы код что ли прислали, чтобы разобраться в Вашей проблеме можно было.
Код: Выделить всё
public abstract class SingleFragmentActivity extends AppCompatActivity {
protected abstract Fragment createFragment();
FragmentManager defaultFragmentManager;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fragment);
invalidateOptionsMenu();
FragmentManager defaultFragmentManager = getSupportFragmentManager();
Fragment fragment = defaultFragmentManager.findFragmentById(R.id.fragment_container);
if (fragment == null) {
fragment = createFragment();
defaultFragmentManager.beginTransaction()
.add(R.id.fragment_container, fragment)
.commit();
}
}
}
Код: Выделить всё
public class MainActivity extends SingleFragmentActivity {
@Override
protected Fragment createFragment() {
//return new SSHFragment();
return new MainTabFragment();
// return new StartFragment();
}
}
Код: Выделить всё
public class MainTabFragment extends Fragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.activity_main);
//Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
//setSupportActionBar(toolbar);
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragmen_main_tan, container, false);
TabLayout tabLayout = (TabLayout) v.findViewById(R.id.tab_layout);
tabLayout.addTab(tabLayout.newTab().setText("Tab 1"));
tabLayout.addTab(tabLayout.newTab().setText("Tab 2"));
tabLayout.addTab(tabLayout.newTab().setText("Tab 3"));
tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
final ViewPager viewPager = (ViewPager) v.findViewById(R.id.pager);
final PagerAdapterFoFragment adapter = new PagerAdapterFoFragment
(getActivity().getSupportFragmentManager(), tabLayout.getTabCount());
viewPager.setAdapter(adapter);
viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
viewPager.setCurrentItem(tab.getPosition());
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});
return v;
}
}
Код: Выделить всё
public class PagerAdapterFoFragment extends FragmentStatePagerAdapter {
ServiceAndDeviceStatus serviceAndDeviceStatus;
TrafficTabMainFragment trafficTabMainFragment;
FindMainFragment findMainFragment;
int mNumOfTabs;
public PagerAdapterFoFragment(FragmentManager fm, int NumOfTabs) {
super(fm);
this.mNumOfTabs = NumOfTabs;
trafficTabMainFragment = new TrafficTabMainFragment();
}
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
return trafficTabMainFragment;
case 1:
return trafficTabMainFragment;
case 2:
return trafficTabMainFragment;
default:
return null;
}
}
@Override
public int getCount() {
return mNumOfTabs;
}
}
Код: Выделить всё
public class TrafficTabMainFragment extends Fragment {
FragmentManager defaultFragmentManager;
Fragment routerListFragment;
Fragment clientListFragment;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.activity_fragment);
// invalidateOptionsMenu();
if (defaultFragmentManager == null) defaultFragmentManager = getChildFragmentManager();
routerListFragment = defaultFragmentManager.findFragmentById(R.id.router_list_fragment_frame);
clientListFragment = defaultFragmentManager.findFragmentById(R.id.client_list_fragment_frame);
if (routerListFragment == null) {
routerListFragment = new RouterListFragment();
defaultFragmentManager.beginTransaction()
.add(R.id.router_list_fragment_frame, routerListFragment)
.commit();
}
if (clientListFragment == null) {
clientListFragment = new ClientListFragment();
defaultFragmentManager.beginTransaction()
.add(R.id.client_list_fragment_frame, clientListFragment)
.commit();
}
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View trafficTabMainFragmentView = inflater.inflate(R.layout.fragment_traffic_tab_main, container,
false);
return trafficTabMainFragmentView;
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
}
@Override
public void onStart() {
super.onStart();
}
@Override
public void onResume() {
super.onResume();
}
}
Код: Выделить всё
public class RouterListFragment extends Fragment {
private RecyclerView routerRecyclerView;
private RouterAdapter routerAdapter;
public static RouterListFragment newInstance(String fragmentID, Connection connectionParam){
Bundle bundle = new Bundle();
bundle.putSerializable(fragmentID, connectionParam);
RouterListFragment routerListFragment = new RouterListFragment();
routerListFragment.setArguments(bundle);
return routerListFragment;
}
private void updateUI(){
WiFiInfoLab wiFiInfoLab = WiFiInfoLab.getWiFiInfoLab(getActivity());
List<Client> clients = wiFiInfoLab.getClients();
List<Router> routers = wiFiInfoLab.getRouters();
if(routerAdapter == null){
routerAdapter = new RouterAdapter(routers);
routerRecyclerView.setAdapter(routerAdapter);
}
else {
routerAdapter.setRouter(routers);
routerAdapter.notifyDataSetChanged();
}
// updateSubtitle();
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_router_list,container,false);
routerRecyclerView = (RecyclerView) v.findViewById(R.id.router_recycler_view);
routerRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
updateUI();
return v;
}
//-----------------------------------------ROUTER-HOLDER-----------------------------------------------
private class RouterHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
private TextView routerBSSIDTextView;
private TextView routerPWRTextView;
private TextView routerCHTextView;
private TextView routerENCTextView;
private TextView routerSSIDTextView;
// private CheckBox mSolvedCheckBox;
private Router router;
public RouterHolder(View itemView) {
super(itemView);
itemView.setOnClickListener(this);
routerBSSIDTextView = (TextView)
itemView.findViewById(R.id.itemRouterBSSIDTextView);
routerPWRTextView = (TextView)
itemView.findViewById(R.id.itemRouterPRWTextView);
routerCHTextView = (TextView)
itemView.findViewById(R.id.itemRouterCHTextView);
routerENCTextView = (TextView)
itemView.findViewById(R.id.itemRouterENCTextView);
routerSSIDTextView = (TextView)
itemView.findViewById(R.id.itemRouterSSIDTextView);
}
private void bindRouter (Router inRouter){
router = inRouter;
routerBSSIDTextView.setText(router.getBSSID());
routerPWRTextView.setText(router.getPWR());
routerCHTextView.setText(router.getChanel());
routerENCTextView.setText(router.getENC());
routerSSIDTextView.setText(router.getSSID());
}
@Override
public void onClick(View v) {
/* Toast.makeText(getActivity(),
mCrime.getmTitle() + " clicked!", Toast.LENGTH_SHORT)
.show();
Intent intent = CrimePagerActivity.newIntent(getActivity(),mCrime.getmId());*/
// startActivityForResult(intent,result);
}
}
//-------------------------ROUTER-ADAPTER-------------------------------------------------------------
private class RouterAdapter extends RecyclerView.Adapter<RouterHolder>{
private List<Router> listRouter;
public RouterAdapter(List<Router> routers) {
listRouter = routers;
}
public void setRouter(List<Router> routers) {
listRouter = routers;
}
@Override
public RouterHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater layoutInflater = LayoutInflater.from(getActivity());
View vv = layoutInflater.inflate(R.layout.item_router_info, parent, false);
return new RouterHolder(vv);
}
@Override
public void onBindViewHolder(RouterHolder holder, int position) {
Router router = listRouter.get(position);
holder.bindRouter(router);
}
@Override
public int getItemCount() {
return listRouter.size();
}
}
}
Код: Выделить всё
public class ClientListFragment extends Fragment {
private RecyclerView clientRecyclerView;
private ClientAdapter clientAdapter;
public static String returnUID = "RETURN_UID_";
public static int result = 15;
private boolean hesCh = false;
private int returnPosition;
private boolean mSubtitleVisible;
public static ClientListFragment newInstance(String fragmentID, Connection connection){
Bundle bundle = new Bundle();
bundle.putSerializable(fragmentID, connection);
ClientListFragment clientListFragment = new ClientListFragment();
clientListFragment.setArguments(bundle);
return clientListFragment;
}
private void updateUI(){
WiFiInfoLab wiFiInfoLab = WiFiInfoLab.getWiFiInfoLab(getActivity());
List<Client> clients = wiFiInfoLab.getClients();
if(clientAdapter == null){
clientAdapter = new ClientAdapter(clients);
clientRecyclerView.setAdapter(clientAdapter);
}
else {
clientAdapter.setClient(clients);
clientAdapter.notifyDataSetChanged();
}
// updateSubtitle();
}
/** private void updateSubtitle() {
CrimeLab crimeLab = CrimeLab.get(getActivity());
int crimeCount = crimeLab.getCrimes().size();
String subtitle = getString(R.string.subtitle_format, crimeCount);
if (!mSubtitleVisible) {
subtitle = null;
}
AppCompatActivity activity = (AppCompatActivity) getActivity();
activity.getSupportActionBar().setSubtitle(subtitle);
}**/
@Override
public void onResume() {
super.onResume();
updateUI();
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_client_list,container,false);
clientRecyclerView = (RecyclerView) v.findViewById(R.id.client_recycler_view);
clientRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
updateUI();
return v;
}
//-----------------------------------------CLIENT-HOLDER-----------------------------------------------
private class ClientHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
private TextView clientBSSIDTextView;
private TextView clientMACTextView;
private TextView clientPWRTextView;
private TextView clientFramesTextView;
// private CheckBox mSolvedCheckBox;
private Client client;
public ClientHolder(View itemView) {
super(itemView);
itemView.setOnClickListener(this);
clientBSSIDTextView = (TextView)
itemView.findViewById(R.id.itemClientBSSIDInfo);
clientMACTextView = (TextView)
itemView.findViewById(R.id.itemClientMACDInfo);
clientPWRTextView = (TextView)
itemView.findViewById(R.id.itemClientPWRInfo);
clientFramesTextView = (TextView)
itemView.findViewById(R.id.itemClientFramesInfo);
}
private void bindClient (Client inClient){
client = inClient;
clientBSSIDTextView.setText(client.getBSSID());
clientMACTextView.setText(client.getMAC());
clientPWRTextView.setText(client.getPWR());
clientFramesTextView.setText(client.getFrame());
}
@Override
public void onClick(View v) {
/* Toast.makeText(getActivity(),
mCrime.getmTitle() + " clicked!", Toast.LENGTH_SHORT)
.show();
Intent intent = CrimePagerActivity.newIntent(getActivity(),mCrime.getmId());
startActivityForResult(intent,result);*/
}
}
//-------------------------CLIENT-ADAPTER-------------------------------------------------------------
private class ClientAdapter extends RecyclerView.Adapter<ClientHolder>{
private List<Client> clients;
public ClientAdapter(List<Client> inClients) {
clients = inClients;
}
public void setClient (List<Client> inClient) {
clients = inClient;
}
@Override
public ClientHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater layoutInflater = LayoutInflater.from(getActivity());
View vv = layoutInflater.inflate(R.layout.item_client_info, parent, false);
return new ClientHolder(vv);
}
@Override
public void onBindViewHolder(ClientHolder holder, int position) {
Client client = clients.get(position);
holder.bindClient(client);
}
@Override
public int getItemCount() {
return clients.size();
}
}
}