1

Как добавить вкладки & Фрагмент динамически?Как добавить вкладки и фрагменты динамически

Мой код:

private void setupViewPager(ViewPager viewPager) { 
    ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager()); 
    for (int i = 0; i < 4; i++) { 
    adapter.addFrag(new TabFragment(), "Tab"+i); 
    } 
    viewPager.setAdapter(adapter); 
    } 

class ViewPagerAdapter extends FragmentPagerAdapter { 
    private final List<Fragment> mFragmentList = new ArrayList<>(); 
    private final List<String> mFragmentTitleList = new ArrayList<>(); 

    public ViewPagerAdapter(FragmentManager manager) { 
     super(manager); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     return mFragmentList.get(position); 
    } 

    @Override 
    public int getCount() { 
     return mFragmentList.size(); 
    } 

    public void addFrag(Fragment fragment, String title) { 
     mFragmentList.add(fragment); 
     mFragmentTitleList.add(title); 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     return mFragmentTitleList.get(position); 
    } 
} 

Tab Фрагмент

public class TabFragment extends ListFragment { 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) { 
    View rootView = inflater.inflate(R.layout.activty_listview,container, false); 
    listView = (ListView) rootView.findViewById(android.R.id.list); 
    return rootView; 
} 

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 

} 

}

Пусть мои названия вкладок являются "Tab1, Таб2, TAB3" Как добавить вкладки динамически в соответствии с Массив, если я получу выше и как проиндексировать фрагмент, знаю, какая вкладка выбрана.

Любые предложения приветствуются.

Заранее спасибо :)

ответ

0
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context=".MainActivity"> 

    <android.support.design.widget.TabLayout 
     android:id="@+id/sliding_tabs" 
     android:layout_width="fill_parent" 
     app:tabMode="fixed" 
     android:background="#ff0000" 
     app:tabGravity="fill" 
     android:layout_height="48dp" /> 

    <android.support.v4.view.ViewPager 
     android:id="@+id/viewpager" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_weight="1" 
     android:layout_below="@+id/sliding_tabs" 
     android:background="@android:color/white" /> 

</RelativeLayout> 

Activity: 


public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     initViews(); 
    } 

    int icons[] = {R.mipmap.createuser, R.mipmap.ico_password, R.mipmap.gplus, R.mipmap.fb}; 
    int colors[] = {Color.YELLOW, Color.CYAN, Color.LTGRAY, Color.CYAN}; 

    void initViews() { 
     TabLayout tabs = (TabLayout) findViewById(R.id.sliding_tabs); 
     ViewPager pager = (ViewPager) findViewById(R.id.viewpager); 
     LayoutInflater inflator = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     ArrayList<Fragment> fragments = new ArrayList<>(Arrays.asList(new Fragment1(),new Fragment2(),new Fragment3(),new Fragment4())); 

     ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager(),fragments); 
     pager.setAdapter(adapter); 
     tabs.setupWithViewPager(pager); 
     for (int i = 0; i < 4; i++) { 
      View view = inflator.inflate(R.layout.tabs,null,false); 

      TextView title = (TextView)view.findViewById(R.id.title); 
      RelativeLayout layout = (RelativeLayout)view.findViewById(R.id.layout); 
      ImageView icon = (ImageView)view.findViewById(R.id.icon); 
      title.setText("Tab" + i); 
      layout.setBackgroundColor(colors[i]); 
      icon.setImageResource(icons[i]); 
      // tabs.getTabAt(i).setCustomView(view); 
     tabs.getTabAt(i).setIcon(icons[i]); 

     } 

    } 


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

Adapter: 

import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentPagerAdapter; 

import java.util.List; 

/** 
* Created by rohit.h on 12/21/2015. 
*/ 
public class ViewPagerAdapter extends FragmentPagerAdapter { 

    String titles[] = {"Tab1", "Tab2", "Tab3", "Tab4"}; 
    private final List<Fragment> fragments; 

    public ViewPagerAdapter(FragmentManager fm, List<Fragment> fragments) { 
     super(fm); 
     this.fragments = fragments; 
    } 

    @Override 
    public Fragment getItem(int position) { 
     return fragments.get(position); 
    } 

    @Override 
    public int getCount() { 
     return fragments.size(); 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     return titles[position]; 
    } 
} 
+0

Я создаю тот же фрагмент для всех вкладок, как я могу различить –

+0

, чтобы создать список как фрагмента, так и заголовков для вкладки во время выполнения и сообщить об этом адаптеру, который он может автоматически обновить или PLZ отобразить код –

+0

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

0
mTabLayout = (TabLayout)rootView.findViewById(R.id.tab_layout); 
     mTabLayout.addTab(mTabLayout.newTab().setText(getResources().getString(R.string.tab1))); 
     mTabLayout.addTab(mTabLayout.newTab().setText(getResources().getString(R.string.tab2))); 
     mTabLayout.addTab(mTabLayout.newTab().setText(getResources().getString(R.string.tab3))); 
     mTabLayout.addTab(mTabLayout.newTab().setText(getResources().getString(R.string.tab4))); 
     mTabLayout.addTab(mTabLayout.newTab().setText(getResources().getString(R.string.tab5))); 
     mTabLayout.setTabGravity(TabLayout.GRAVITY_FILL); 
     mTabLayout.setTabMode(TabLayout.MODE_SCROLLABLE); 

     mViewPager = (ViewPager)rootView.findViewById(R.id.pager); 

     mPagerAdapter = new PagerAdapter 
       (getActivity().getSupportFragmentManager(), mTabLayout.getTabCount()); 

     mViewPager.setAdapter(mPagerAdapter); 
     mViewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(mTabLayout)); 

Вы можете обратиться this ссылку

0

Простое решение (но не самый лучший/совершенный) можно было бы добавить фрагменты к адаптеру и установить tablayout и адаптер для viewpager снова во время выполнения. Не будет чистым/может быть рывком, но определенно будет работать.

EDIT :: В FragmentPagerAdapter есть метод, который также установлен на viewpager и tablayout: notifyDataSetChanged(). Используйте этот метод после вставки и удаления фрагментов из адаптера пейджера. Я попробовал это для его вставки. Должен определенно работать и на удаление.

+0

Очень простой ответ. Я думаю, вам стоит попробовать добавить примерный код. – GhostCat

Смежные вопросы