如何将片段和appCompatactivity扩展到同一类



我有一个类。

代码在

下面
public class aboutSLFragment extends Fragment  {
public aboutSLFragment() {
    // Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    return inflater.inflate(R.layout.fragment_about_sl, container, false);
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    //you can set the title for your toolbar here for different fragments different titles
    getActivity().setTitle("About Sri Lanka");
}
}

现在我想在该类中添加一个图像滑块。我使用的代码是。

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    viewPager = (ViewPager) findViewById(R.id.viewPager);
    sliderDotspanel = (LinearLayout) findViewById(R.id.SliderDots);
    ViewPagerAdapter viewPagerAdapter = new ViewPagerAdapter(this);
    viewPager.setAdapter(viewPagerAdapter);
    dotscount = viewPagerAdapter.getCount();
    dots = new ImageView[dotscount];
    for(int i = 0; i < dotscount; i++){
        dots[i] = new ImageView(this);
        dots[i].setImageDrawable(ContextCompat.getDrawable(getApplicationContext(), R.drawable.non_active_dot));
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
        params.setMargins(8, 0, 8, 0);
        sliderDotspanel.addView(dots[i], params);
    }
    dots[0].setImageDrawable(ContextCompat.getDrawable(getApplicationContext(), R.drawable.active_dot));
    viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
        }
        @Override
        public void onPageSelected(int position) {
            for(int i = 0; i< dotscount; i++){
                dots[i].setImageDrawable(ContextCompat.getDrawable(getApplicationContext(), R.drawable.non_active_dot));
            }
            dots[position].setImageDrawable(ContextCompat.getDrawable(getApplicationContext(), R.drawable.active_dot));
        }
        @Override
        public void onPageScrollStateChanged(int state) {
        }
    });
}

当我将此映像滑块代码添加到atslfragment类中时,代码将如下(下(

public class aboutSLFragment extends Fragment  {
ViewPager viewPager;
LinearLayout sliderDotspanel;
private int dotscount;
private ImageView[] dots;

public aboutSLFragment() {
    // Required empty public constructor
}
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    viewPager = (ViewPager) findViewById(R.id.viewPager);
    sliderDotspanel = (LinearLayout) findViewById(R.id.SliderDots);
    ViewPagerAdapter viewPagerAdapter = new ViewPagerAdapter(this);
    viewPager.setAdapter(viewPagerAdapter);
    dotscount = viewPagerAdapter.getCount();
    dots = new ImageView[dotscount];
    for(int i = 0; i < dotscount; i++){
        dots[i] = new ImageView(this);
        dots[i].setImageDrawable(ContextCompat.getDrawable(getApplicationContext(), R.drawable.non_active_dot));
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
        params.setMargins(8, 0, 8, 0);
        sliderDotspanel.addView(dots[i], params);
    }
    dots[0].setImageDrawable(ContextCompat.getDrawable(getApplicationContext(), R.drawable.active_dot));
    viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
        }
        @Override
        public void onPageSelected(int position) {
            for(int i = 0; i< dotscount; i++){
                dots[i].setImageDrawable(ContextCompat.getDrawable(getApplicationContext(), R.drawable.non_active_dot));
            }
            dots[position].setImageDrawable(ContextCompat.getDrawable(getApplicationContext(), R.drawable.active_dot));
        }
        @Override
        public void onPageScrollStateChanged(int state) {
        }
    });
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    return inflater.inflate(R.layout.fragment_about_sl, container, false);
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    //you can set the title for your toolbar here for different fragments different titles
    getActivity().setTitle("About Sri Lanka");
}
}

但这给出了一大堆错误。但是当我扩展AppCompatactivity类时,错误消失了。

public class aboutSLFragment extends Fragment, AppCompatActivity  

我知道我们不能继承两个类。那么我该怎么办?请帮我?如果有人纠正我的代码,将不胜感激。

我添加了一个映像滑块。P>

public class aboutSLFragment extends Fragment{
ViewPager viewPager;
LinearLayout sliderDotspanel;
private int dotscount;
private ImageView[] dots;

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

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    viewPager = (ViewPager) **findViewById**(R.id.viewPager);
    sliderDotspanel = (LinearLayout) **findViewById**(R.id.SliderDots);
    ViewPagerAdapter viewPagerAdapter = new ViewPagerAdapter(**this**);
    viewPager.setAdapter(viewPagerAdapter);
    dotscount = viewPagerAdapter.getCount();
    dots = new ImageView[dotscount];
    for(int i = 0; i < dotscount; i++){
        dots[i] = new ImageView(**this**);
        dots[i].setImageDrawable(ContextCompat.getDrawable(**getApplicationContext()**, R.drawable.non_active_dot));
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
        params.setMargins(8, 0, 8, 0);
        sliderDotspanel.addView(dots[i], params);
    }
    dots[0].setImageDrawable(ContextCompat.getDrawable(**getApplicationContext()**, R.drawable.active_dot));
    viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
        }
        @Override
        public void onPageSelected(int position) {
            for(int i = 0; i< dotscount; i++){
                dots[i].setImageDrawable(ContextCompat.getDrawable(**getApplicationContext()**, R.drawable.non_active_dot));
            }
            dots[position].setImageDrawable(ContextCompat.getDrawable(**getApplicationContext()**, R.drawable.active_dot));
        }
        @Override
        public void onPageScrollStateChanged(int state) {
        }
    });
    // Inflate the layout for this fragment
    return inflater.inflate(R.layout.fragment_about_sl, container, false);
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    //you can set the title for your toolbar here for different fragments different titles
    getActivity().setTitle("About Sri Lanka");
}

}

我更改了您的代码。问题是:

  1. findViewById()。活动已经具有findViewById()方法,因此您可以在活动中调用它。但是Fragment没有此方法。在Fragment中,您必须通过View.findViewById()方法找到视图,在这里View将是您在onCreateView()中充气的视图
  2. new ViewPagerAdapter(this)。要创建一个视图,您必须提供活动上下文。在这里,您正在通过this您的片段实例不是活动上下文
  3. ContextCompat.getDrawable()此方法还采用上下文。getApplicationContext()在片段中不可用。您必须从片段调用getActivity()getContext()以获取活动的上下文。

    public class aboutSLFragment extends Fragment{
    ViewPager viewPager;
    LinearLayout sliderDotspanel;
    private int dotscount;
    private ImageView[] dots;
    public aboutSLFragment() {
      // Required empty public constructor
    }
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_about_sl, container, false);
    viewPager = (ViewPager) rootView .findViewById(R.id.viewPager);
    sliderDotspanel = (LinearLayout)rootView.findViewById(R.id.SliderDots);
    ViewPagerAdapter viewPagerAdapter = new ViewPagerAdapter(getContext());
    viewPager.setAdapter(viewPagerAdapter);
    dotscount = viewPagerAdapter.getCount();
    dots = new ImageView[dotscount];
    for(int i = 0; i < dotscount; i++){
        dots[i] = new ImageView(getContext());
        dots[i].setImageDrawable(ContextCompat.getDrawable(getContext(), R.drawable.non_active_dot));
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
        params.setMargins(8, 0, 8, 0);
        sliderDotspanel.addView(dots[i], params);
    }
    dots[0].setImageDrawable(ContextCompat.getDrawable(getContext(), R.drawable.active_dot));
    viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
        }
        @Override
        public void onPageSelected(int position) {
            for(int i = 0; i< dotscount; i++){
                dots[i].setImageDrawable(ContextCompat.getDrawable(getContext(), R.drawable.non_active_dot));
            }
            dots[position].setImageDrawable(ContextCompat.getDrawable(getContext(), R.drawable.active_dot));
        }
        @Override
        public void onPageScrollStateChanged(int state) {
        }
    });
     // Inflate the layout for this fragment
     return rootView;
    }
    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
      super.onViewCreated(view, savedInstanceState);
      //you can set the title for your toolbar here for different fragments different titles
      getActivity().setTitle("About Sri Lanka");
     }
    }
    

检查此代码。

最新更新