Android 重用其他选项卡中的一个片段,我还希望为不同的选项卡动态构建UI,而不会膨胀XML
我正在做我的第一个应用程序,其中,我使用标签片段。在本文中,我希望重用其他选项卡中的一个片段,还希望为不同的选项卡动态构建UI,而不会膨胀XML 活动中的代码如下所示Android 重用其他选项卡中的一个片段,我还希望为不同的选项卡动态构建UI,而不会膨胀XML,android,android-fragments,android-framelayout,Android,Android Fragments,Android Framelayout,我正在做我的第一个应用程序,其中,我使用标签片段。在本文中,我希望重用其他选项卡中的一个片段,还希望为不同的选项卡动态构建UI,而不会膨胀XML 活动中的代码如下所示 public class Schedules extends AppCompatActivity { private TabLayout tabLayout; private ViewPager viewPager; @Override protected void onCreate(Bundl
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 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;
}
当重用片段时,它应该满足某些标准,即它遵循相同的上下文,我的意思是外观将是相同的,但取决于提供给片段的数据,它的UI和显示的信息将发生变化 如果您的片段为该片段提供了完全不同的UI和数据结构,那么它必须处理不同的场景,在这些场景中,它必须以不同的方式工作,这将增加同一片段中的代码开销。在这种情况下,最好制作两个不同的片段 如果您坚持重用片段,您可以创建该片段的实例(
MyFragment
),并根据您提供的数据和类型来重用和填充内部UI和数据,请注意这只会增加您的工作量
MyFragment.newInstance("English","data");
MyFragment.newInstance("Social","data");
MyFragment.newInstance("Science","data");
我的片段看起来像这样
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 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
方法中设置条件,以根据提供给此片段的数据类型适当地使用片段我试图实现,但没有实现,因此,我决定在片段内以编程方式构建UI,如果有人有任何链接,请给我的链接,这将是巨大的helpful@Naveen,尝试了解工厂方法是如何工作的,它将帮助您使用要显示的数据实例化对象,以便您可以在代码中做出更改UI的决定。您可以多次使用LayoutInflater来膨胀代码中的布局