TabLayout + вложенные фрагменты.

Интерфейс, диалоги, темы, стили, меню
Ответить
varlok3000
Сообщения: 16
Зарегистрирован: 03 авг 2013, 22:55

TabLayout + вложенные фрагменты.

Сообщение varlok3000 » 27 май 2016, 15:51

Добрый день. Использую в приложении TabLayout, ViewPager и FragmentStatePagerAdapter таким образом, чтобы во вкладках TabLayout были фрагменты, и эти фрагменты, в свою очередь, содержат вложенные фрагменты. Возник вопрос: как можно во вложенных фрагментах отследить событие, когда пользователь переключается на кладку, которая содержит фрагмент-родитель вложенных фрагментов? Хочу реализовать механизм, который будет обновлять содержимое вложенных фрагментов каждый раз, когда пользователь переключается на соответствующую вкладку.

Sergey777
Сообщения: 68
Зарегистрирован: 30 мар 2015, 17:16

Re: TabLayout + вложенные фрагменты.

Сообщение Sergey777 » 30 май 2016, 11:57

varlok3000 писал(а):Добрый день. Использую в приложении TabLayout, ViewPager и FragmentStatePagerAdapter таким образом, чтобы во вкладках TabLayout были фрагменты, и эти фрагменты, в свою очередь, содержат вложенные фрагменты. Возник вопрос: как можно во вложенных фрагментах отследить событие, когда пользователь переключается на кладку, которая содержит фрагмент-родитель вложенных фрагментов? Хочу реализовать механизм, который будет обновлять содержимое вложенных фрагментов каждый раз, когда пользователь переключается на соответствующую вкладку.
Здравствуйте! Вы бы код что ли прислали, чтобы разобраться в Вашей проблеме можно было. Как это так Вы смогли сделать, чтобы у фрагментов были свои вложенные фрагменты? Если фрагменты статические, то Вы не сможете их обновлять при свайпе. В этом случае все статические фрагменты каждого таба, при создании активности где вы инициализируете ViewPager и подключаете FragmentStatePagerAdapter к ViewPager, будут создаваться одновременно, даже если вы не видите остальных фрагментов. Поэтому для динамической работы с фрагментами и обновления их содержимого, Вам нужно будет их динамически создавать. А дальнейший ответ будет зависеть от предоставленного Вами кода.

varlok3000
Сообщения: 16
Зарегистрирован: 03 авг 2013, 22:55

Re: TabLayout + вложенные фрагменты.

Сообщение varlok3000 » 31 май 2016, 11:47

Здравствуйте! Вы бы код что ли прислали, чтобы разобраться в Вашей проблеме можно было.
Вот часть кода. По задумке, во вкладках (табах) будут разные фрагменты , внутри которых будут свои фрагменты (вложенные фрагменты).

Код: Выделить всё

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();
        }


    }


}

Ответить