如何将fragment和AppCompatActivity都扩展到同一类? [英] How to extend both fragment and AppCompatActivity to a same class?

查看:66
本文介绍了如何将fragment和AppCompatActivity都扩展到同一类?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个类.我将Fragment扩展到了这个类,因为我在开发Navigation Drawer时使用了片段.

I have a class.I have extended Fragment to this class because I used fragments when developing Navigation Drawer.

代码在下面

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");
}

}

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

Now I want to add a image slider to that class.The code I used is this.

@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) {

        }
    });

}

当我将此图像滑块代码添加到aboutSLFragment类中时,代码将如下所示(如下)

When I add this image slider code to the aboutSLFragment class the code will be like this(below)

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类时,错误会消失,除了一个错误.像这样(如下)

But this gives a whole bunch of errors.But when I extend the AppCompatActivity class the errors disappear except for one.Like this(below)

public class aboutSLFragment extends Fragment, AppCompatActivity  

据我所知我们不能继承两个类,那么我应该怎么做才能解决呢?请帮我?如果有人更正我的代码,将不胜感激.

As I know we can't inherit two classes.So what should I do to resolve it? please help me? It would be greatly appreciated if someone corrects my code.

我在aboutSLFragment.java中添加了一个图像滑块,但是有一些我无法修复的错误.我是android新手,所以请有人告诉我如何修复错误.我将这些错误加粗了.

I've added an image slider to aboutSLFragment.java but there are some errors which I cannot fix.I'm new to android so please somebody tell me how to fix the errors.I've bolded the errors.

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");
}

}

推荐答案

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

I have changed your code. Problem was:

  1. findViewById().活动已经具有 findViewById()方法,因此您可以在活动"中调用它.但是 Fragment 没有这种方法.在 Fragment 中,您必须通过 View.findViewById()方法找到一个View,这里的 View 将是您在中夸大的视图onCreateView()
  2. 新的ViewPagerAdapter(this).要创建一个视图,您必须提供一个活动上下文.在这里,您要传递 this 的Fragment实例,而不是Activity Context
  3. ContextCompat.getDrawable()此方法也需要一个Context. getApplicationContext()在Fragment中不可用.您必须从Fragment调用 getActivity() getContext()来获取活动的上下文.

  1. findViewById(). Activity already have findViewById() method so you can call it in Activity. But Fragment don't have this method. In Fragment you have to find a View by View.findViewById() method, here View will be the view you are inflating in onCreateView()
  2. new ViewPagerAdapter(this). To create a View you have to provide a Activity Context. Here you are passing this its your Fragment instance not Activity Context
  3. ContextCompat.getDrawable() this method also takes a Context. getApplicationContext() is not available in Fragment. You have to call getActivity() or getContext() from Fragment to get Context of the Activity.

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");
 }

}

检查此代码.

这篇关于如何将fragment和AppCompatActivity都扩展到同一类?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆