两个碎片重构为一个

问题描述 投票:0回答:1

我创建了两个片段。"scheduleFragment "和 "clockFragment"。设置好后

public class ClockFragment extends AppCompatActivity implements View.OnClickListener {
private int notificationId = 1;

在MainActivity.java中,pageAdapter

        scheduleFragment = new ScheduleFragment();
    clockFragment = new ClockFragment();

    tabLayout.setupWithViewPager(viewPager);

    ViewPagerAdapter viewPagerAdapter = new ViewPagerAdapter(getSupportFragmentManager(), 0);
    viewPagerAdapter.addFragment(clockFragment, "Clock");
    viewPagerAdapter.addFragment(scheduleFragment, "Schedule");
    viewPager.setAdapter(viewPagerAdapter);

创建一个错误,说明我必须将clockFragment切换重构到scheduleFragment中,这样就创建了一个片段。

我需要这两个片段,因为在ClockFragment(标签)中,时钟必须出现在用户面前,而在ScheduleFragment(标签)中,用户的日程表是存在的。我不知道如何才能在不引起错误的情况下将这两个标签分开。

如果能解释一下为什么会出现这个错误,并提供解决方案,我将非常感激。

public class MainActivity extends AppCompatActivity {

private Toolbar toolbar;
private ViewPager viewPager;
private TabLayout tabLayout;

private ScheduleFragment scheduleFragment;
private ClockFragment clockFragment;


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

    ViewPager viewPager = findViewById(R.id.view_pager);
    viewPager.setAdapter(new ViewPagerAdapter(getSupportFragmentManager()));

    toolbar = findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    viewPager = findViewById(R.id.view_pager);
    tabLayout = findViewById(R.id.tab_layout);

    scheduleFragment = new ScheduleFragment();
    clockFragment = new ClockFragment();

    tabLayout.setupWithViewPager(viewPager);

    tabLayout.getTabAt(0).setIcon(R.drawable.ic_baseline_add_alarm_24);
    tabLayout.getTabAt(1).setIcon(R.drawable.ic_baseline_assignment_turned_in_24);
}

private class ViewPagerAdapter extends FragmentPagerAdapter {

    private List<Fragment> fragments = new ArrayList<>();
    private List<String> fragmentTitle = new ArrayList<>();

    public ViewPagerAdapter(@NonNull FragmentManager fm, int behavior) {
        super(fm, behavior);
    }

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

    public void addFragment(ClockFragment fragment, String title) {
        fragments.add(fragment);
        fragmentTitle.add(title);
    }

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

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

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

}

android android-studio android-fragments android-viewpager
1个回答
0
投票

首先ClockFragment扩展了Activity,这意味着它不是一个片段。

我将给你一个例子来说明你应该如何做事情。

public class ChildFragment1 extends Fragment {

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    super.onCreateView(inflater, container, savedInstanceState);
    View rootView = inflater.inflate(R.layout.child_fragment_1_layout, container, false);
    Button buttonInFragment1 = rootView.findViewById(R.id.button_1);
    buttonInFragment1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Toast.makeText(getContext(), "button in fragment 1", Toast.LENGTH_SHORT).show();
        }
    });

    return rootView;
}
}

现在做Fragment 2:

public class ChildFragment2 extends Fragment {

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    super.onCreateView(inflater, container, savedInstanceState);
    View rootView = inflater.inflate(R.layout.child_fragment_1_layout, container, false);
    Button buttonInFragment1 = rootView.findViewById(R.id.button_1);
    buttonInFragment1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Toast.makeText(getContext(), "button in fragment 2", Toast.LENGTH_SHORT).show();
        }
    });

    return rootView;
}
}

现在为适配器添加一个新类

public class ViewPagerAdapter extends FragmentPagerAdapter {

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

@Override
public Fragment getItem(int position) {
    switch (position)
    {
        case 0:
            return new ChildFragment1(); //ChildFragment1 at position 0
        case 1:
            return new ChildFragment2(); //ChildFragment2 at position 1

    }
    return null; //does not happen
}

@Override
public int getCount() {
    return 2; //three fragments
}
}

然后你的MainActivity会是这样的:

public class MainActivity extends AppCompatActivity {

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

    ViewPager viewPager = findViewById(R.id.view_pager);
    viewPager.setAdapter(new ViewPagerAdapter(getSupportFragmentManager()));
}
}
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.