以编程方式从String []添加按钮

时间:2016-06-16 16:30:55

标签: android arrays string android-fragments

我试图动态添加String[]中项目的按钮。 我的方法是以编程方式添加与数组中的项目一样多的按钮,并为每个按钮分配该数组中的文本。 (我了解如何从项目中以编程方式添加按钮。)

我的问题是无法将String[] buttonStrings从课程TestOne传递到片段FragmentTest

String[] buttonStrings的日志返回null,但是它返回String title的正确值。

我的猜测是我没有在某处初始化String[] buttonStrings。或许我的方法不正确。

这是我的TestOne班级

public class TestOne extends ActualFragmetIntro {

 @Override
 public void init(Bundle savedInstanceState) {
    addSlide(FragmentTest.newInstance("This is the string from TestOne", new String[]{"Button1 Text, Button2 Text ,Button3 text , Button4 Text"}));

下面是我的FragmentTest片段

public class FragmentTest extends Fragment { 
 private static final String ARG_TITLE = "title";
 private static final String[] ARG_BUTTON_TEXTS_STRINGS = {"buttons_texts"};
 //private static final String ARG_BUTTON_TEXTS_STRINGS = {"buttons_texts"};
 //private static final ArrayList<String> ARG_BUTTON_TEXTS_STRINGS = new ArrayList<String>();

public static FragmentTest newInstance(String title, String[] buttonStrings) {
  FragmentTest sampleSlide = new FragmentTest();
  Bundle args = new Bundle();
  args.putString(ARG_TITLE, title);
  args.putStringArrayList(buttonStrings.toString(), ARG_BUTTON_TEXTS_STRINGS);
  sampleSlide.setArguments(args);

  return sampleSlide;
}

public static FragmentTest newInstance(String title, String[] buttonStrings) {
  FragmentTest sampleSlide = new FragmentTest();
  Bundle args = new Bundle();
  args.putString(ARG_TITLE, title);
  args.putStringArrayList(buttonStrings.toString(), ARG_BUTTON_TEXTS_STRINGS);
  sampleSlide.setArguments(args);

  return sampleSlide;
}

private String[] getArgButtonTextsStrings = new String[0];

public FragmentTest() {

}

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
  ....
if (getArguments() != null && getArguments().size() != 0) {
  title = getArguments().getString(ARG_TITLE);
  getArgButtonTextsStrings = getArguments().getStringArray(String.format(String.valueOf(ARG_BUTTON_TEXTS_STRINGS)));

  System.out.println("logged onCreate " + title +"  "+ getArgButtonTextsStrings );
 }
}
...

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
 super.setUserVisibleHint(isVisibleToUser);
  if(isVisibleToUser&& isResumed()){
  title = getArguments().getString(ARG_TITLE);
  getArgButtonTextsStrings = getArguments().getStringArray(String.format(String.valueOf(ARG_BUTTON_TEXTS_STRINGS)));

}else {

}
}

编辑添加了addSlide代码

public abstract class ActualFragmetIntro extends FragmentActivity implements SceneIntroFragment4Objects.ClickCounterListener, TextToSpeech.OnInitListener {
private PagerIntroAdapter mPagerAdapter;
private ViewPager pager;
private List<Fragment> fragments = new Vector<>();
...

public void addSlide(@NonNull Fragment fragment) {
    fragments.add(fragment);
    mPagerAdapter.notifyDataSetChanged();
}

1 个答案:

答案 0 :(得分:1)

您可以使用标记buttonStrings.toString()设置数据 但您正在尝试使用以下内容获取数据:String.format(String.valueOf(ARG_BUTTON_TEXTS_STRINGS))

这些标签是不同的,这就是你获得空数组的原因。

您应该将标记定义为常量:

private static final String ARG_BUTTONS_TEXT = "buttons";

然后在你的newInstance中:

public static FragmentTest newInstance(String title, String[] buttonStrings) {
    FragmentTest sampleSlide = new FragmentTest();
    Bundle args = new Bundle();
    args.putString(ARG_TITLE, title);
    args.putStringArray(ARG_BUTTONS_TEXT, buttonStrings);
    sampleSlide.setArguments(args);

    return sampleSlide;
}

在你的onCreate:

getArgButtonTextsStrings = getArguments().getStringArray(ARG_BUTTONS_TEXT);