用于名称的类添加参数以实例化片段

时间:2014-03-07 12:58:56

标签: java android android-fragments android-viewpager nosuchmethoderror

好的,我的问题有点难以解释。

我有一个滑动片段的滑块。它只是一个简单的视图寻呼机。 现在我想让它更具可重用性: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”)

1 个答案:

答案 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