2016-03-14 2 views
0

Я занимаюсь своим первым приложением, в котором я использую фрагменты для вкладок. в этом я хочу, чтобы повторно использовать один фрагмент в других закладках также я хочу построить пользовательский интерфейс Динамическим для различных вкладок без раздувания XML The Screen shot is hereповторное использование одного фрагмента на других вкладках также я хочу динамически создавать интерфейс для разных вкладок без раздувания XML

кода внутри деятельности Похоже, этого

public class Schedules extends AppCompatActivity { 

    private TabLayout tabLayout; 
    private ViewPager viewPager; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_schedules); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 
     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 

     viewPager = (ViewPager) findViewById(R.id.viewpager); 
     setupViewPager(viewPager); 

     tabLayout = (TabLayout) findViewById(R.id.tabs); 
     tabLayout.setupWithViewPager(viewPager); 
    } 

    private void setupViewPager(ViewPager viewPager) { 
     ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager()); 
     adapter.addFragment(new FragmentOne(), "SCIENCE"); 
     adapter.addFragment(new FragmentOne(), "SOCIAL"); 
     adapter.addFragment(new FragmentOne(), "ENGLISH"); 
     viewPager.setAdapter(adapter); 
    } 

    class ViewPagerAdapter extends FragmentPagerAdapter { 
     private final List<Fragment> mFragmentList = new ArrayList<>(); 
     private final List<String> mFragmentTitleList = new ArrayList<>(); 
     private final List<String> mFragmentDays = new ArrayList<>(); 
     private final List<String> mFragmentTimings = 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 addFragment(Fragment fragment, String title) { 
      mFragmentList.add(fragment); 
      mFragmentTitleList.add(title); 

     } 

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

и кодом внутри фрагмент идет здесь

public class FragmentOne extends Fragment{ 

    LinearLayout lLayout; 
    TextView tView; 

    public FragmentOne() { 
     // Required empty public constructor 
    } 

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

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
return inflater.inflate(R.layout.fragment_one, container, false); 
    } 
} 

ответ

0

в то время как повторное использование фрагмента он должен соответствовать определенным критериям, что его следует тому же контекст, что я имею в виду внешний вид будет таким же, но в зависимости от данных, предоставленного фрагментом это UI и информации ДИСПЛЕЙ yed будет изменяться,

Если ваши фрагменты имеют совершенно разные структуры пользовательского интерфейса и данных, предоставленные этому фрагменту, ему придется иметь дело с различными сценариями, в которых он должен работать по-другому, что увеличит накладные расходы кода в том же фрагменте. в этом случае вам лучше сделать два разных фрагмента.

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

MyFragment.newInstance("English","data"); 

MyFragment.newInstance("Social","data"); 

MyFragment.newInstance("Science","data"); 

MyFragment будет выглядеть примерно так

public class MyFragment extends Fragment { 
// TODO: Rename parameter arguments, choose names that match 
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER 
private static final String ARG_PARAM1 = "param1"; 
private static final String ARG_PARAM2 = "param2"; 

// TODO: Rename and change types of parameters 
private String mParam1; 
private String mParam2; 

public MyFragment() { 
    // Required empty public constructor 
} 

public static MyFragment newInstance(String param1, String param2) { 
    MyFragment fragment = new MyFragment(); 
    Bundle args = new Bundle(); 
    args.putString(ARG_PARAM1, param1); 
    args.putString(ARG_PARAM2, param2); 
    if (param1.equalsIgnoreCase("ENGLISH")) { 
     //THIS IS INSTANCE OF ENGLISH TYPE DATA 
    } else if (param1.equalsIgnoreCase("SCIENCE")) { 
     //THIS IS INSTANCE OF SCIENCE TYPE DATA 
    }else if (param1.equalsIgnoreCase("SOCIAL")) { 
     //THIS IS INSTANCE OF SOCIAL TYPE DATA 
    } 
    fragment.setArguments(args); 
    return fragment; 
} 

вы должны сделать условие в onCreateView и onActivityCreated методов, чтобы использовать фрагмент соответствующим образом в зависимости от типа данных, предоставленного для этого фрагмента

+0

спасибо за ответ, будет реализовывать и видеть –

+0

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

+0

@Naveen, попробуйте понять, как работает заводской метод. Это поможет вам создать экземпляр объекта с данными, которые вы хотите показать, чтобы вы могли принять решение в коде об изменении интерфейса. Вы можете использовать LayoutInflater несколько раз, чтобы раздуть макет в коде. –

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