好的,我的问题有点难以解释。
我有一个滑动片段的滑块。它只是一个简单的视图寻呼机。 现在我想让它更具可重用性:P
我的设置是这样的: SliderContainer(我在这里得到了viewpager,这只是一个我可以包含任何内容的片段)。 滑块(这是导致问题的滑块本身,这个由包含滑块的容器包含,因此滑块容器)。 SliderFragment(这是你可以滑动tru的布局,这包括一个.xml文件和一个使用这个.xml文件的类,然后我就可以自定义onclicklisteners等了。在java文件中,所以这是滑块对象被Slider.java使用。
我想重用此代码。滑块片段只需要更换,如果我想将它添加到另一个页面,因为另一个页面需要另一个布局和其他功能。
所以滑块包含的类(现在它的静态sliderFragment),但应该由参数调用,我应该更改它的名称,所以我只需要替换函数文件,并将此类的名称传递给sliderContainer >滑块> sliderFragment。
我使用class.forname,它可以将字符串名称转换为类名。都好。 这是一段滑块中的代码,其中包含sliderFragment。
@Override
public Fragment getItem(int position)
{
// make the first pager bigger than others
if (position == slider_firstpage)
scale = Constants.slider_bigscale;
else
scale = Constants.slider_smallscale;
position = position % slider_pages;
try {
c = Class.forName("com.homeslider.SliderFragment").getConstructor(Slider.class, Integer.class, Integer.class, Float.class, String.class, String.class);
return (Fragment) c.newInstance(context, position, scale, slider_titles, slider_images);
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
SliderFragment需要:context,int,int,String数组,String数组。 这是sliderFragment需要的参数。
最初我只会这样做:
return SliderFragment.newInstance(context, position, scale, slider_titles, slider_images);
我使用的代码对我来说似乎不太好,它只抛出一个NoSuchMethodFound异常,但是whatelse出错了? 在互联网上没有其他材料可以使用这种方法来设置片段,所以我需要在这里问。
所以我的最后一个问题是: 为什么它会显示noSuchMethodFound错误(我知道我在getParameters中使用了错误的类型,但我不知道我需要使用什么),除此之外我的代码中出了什么问题呢? 有什么建议吗?
我愿意接受任何帮助:)
根据要求:
SliderContainer.java(容器片段)
import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.view.ViewPager;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class SliderContainer extends Fragment {
public Slider adapter;
public static ViewPager pager;
public static int slider_pages;
public static int slider_firstpage;
// public int slider_fragmentlayout;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
Bundle getExtras = this.getArguments();
View view = inflater.inflate(R.layout.sliderselecting, container, false);
slider_pages = getExtras.getStringArray("images").length;
slider_firstpage = slider_pages * Constants.slider_loops / 2;
pager = (ViewPager) view.findViewById(getExtras.getInt("layoutcontainer"));
adapter = new Slider(getActivity(), this.getFragmentManager(), getExtras.getStringArray("titles"),
getExtras.getStringArray("images"), slider_pages, slider_firstpage);
pager.setAdapter(adapter);
pager.setOnPageChangeListener(adapter);
pager.setCurrentItem(slider_firstpage);
pager.setOffscreenPageLimit(3);
pager.setPageMargin(-220);
return view;
}
}
这个参数通过getArguments从他的主机活动中获取参数,并在将其设置为适配器时将这些参数传递给Slider.java。
我在哪里创建我的sliderContainer(所以他的主机活动)。
public void SliderInit(int container){
Bundle slider_addOptions = new Bundle();
main_radioslider = new SliderContainer();
slider_addOptions.putStringArray("titles", slider_names);
slider_addOptions.putStringArray("images", slider_images);
slider_addOptions.putInt("layoutcontainer", R.id.sliderContainer); // SliderContainer.xml
main_radioslider.setArguments(slider_addOptions);
getSupportFragmentManager().beginTransaction().add(container, main_radioslider).commit();
}
它生成片段(SliderContainer.java)并使用addArguments添加参数。 R.id.sliderContainer是sliderContainer使用的viewpager,不会在slider.java中使用。
重要提示: 当我使用这个代码没有类名称方法时,它工作。 所以这里没有任何错误,将数据从Slider发送到SliderFragment.java并制作片段是错误的。
sliderfragment.java中的数据接收:
public static Fragment newInstance(Context context, int pos, float scale, String[] slider_titles
, String[] slider_fragmentbackground)
{
Bundle b = new Bundle();
b.putInt("pos", pos);
b.putFloat("scale", scale);
b.putStringArray("names", slider_titles);
b.putStringArray("images", slider_fragmentbackground);
return Fragment.instantiate(context, SliderFragment.class.getName(), b);
}
通过调用onCreateView并在我的代码中重用该代码并执行此操作.getArgument()。get - type - (“key”)
答案 0 :(得分:0)
请尝试使用以下两行代码:
c = Class.forName("com.homeslider.SliderFragment").getConstructor(Context.class, Integer.TYPE, Float.TYPE, String[].class, String[].class);
return (Fragment) c.newInstance(context, position, scale, slider_titles, slider_images);
下式给出:
context is of type Context
position is of type primitive int
scale is of type primitive float
slider_titles is an String array
slider_images is a String array