Android 重用其他选项卡中的一个片段,我还希望为不同的选项卡动态构建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

我正在做我的第一个应用程序,其中,我使用标签片段。在本文中,我希望重用其他选项卡中的一个片段,还希望为不同的选项卡动态构建UI,而不会膨胀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 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来膨胀代码中的布局