问题
I have a class.I have extended Fragment to this class because I used fragments when developing Navigation Drawer.
The code is below
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) {
}
});
}
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");
}
}
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.
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");
}
}
回答1:
I have changed your code. Problem was:
findViewById()
. Activity already havefindViewById()
method so you can call it in Activity. ButFragment
don't have this method. InFragment
you have to find a View byView.findViewById()
method, hereView
will be the view you are inflating inonCreateView()
new ViewPagerAdapter(this)
. To create a View you have to provide a Activity Context. Here you are passingthis
its your Fragment instance not Activity ContextContextCompat.getDrawable()
this method also takes a Context.getApplicationContext()
is not available in Fragment. You have to callgetActivity()
orgetContext()
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"); } }
Check this code.
来源:https://stackoverflow.com/questions/48730189/how-to-extend-both-fragment-and-appcompatactivity-to-a-same-class