【问题标题】:Programmatically adding buttons from String[]以编程方式从 String[] 添加按钮
【发布时间】:2016-06-16 16:30:55
【问题描述】:

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

我的问题是无法将 String[] buttonStrings 从类 TestOne 传递给片段 FragmentTest

日志为String[] buttonStrings 返回空值,但它为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();
}

【问题讨论】:

    标签: android arrays string android-fragments


    【解决方案1】:

    您使用标签设置数据:buttonStrings.toString()
    但是您正在尝试使用:String.format(String.valueOf(ARG_BUTTON_TEXTS_STRINGS)) 获取数据。

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

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

    private static final String ARG_BUTTONS_TEXT = "buttons";
    

    然后在你的新实例中:

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

    【讨论】:

    • 您好,感谢您的回复。如果我做args.putStringArrayList(ARG_BUTTONS_TEXT, buttonStrings);,我在buttonStrings 上得到一个错误,说第二个参数是错误的,它找到java.lang.String[] 并且它需要java.util.ArrayList&lt;java.lang.String&gt;。所以我将args.putStringArrayList 更改为args.putStringArray,但这仍然返回一个空值。我应该做new ArrayList&lt;String&gt;(Arrays.asList("one, two ,three , four")) 而不是new String[]{"one, two ,three , four"} in TestOne` 类
    • 你能把代码贴在addSlide吗?可能您没有使用相同的 Fragment 实例
    • 抱歉延迟回复。我在我的问题中添加了addslide 代码
    • 啊,你的回答是正确的。我犯了两个愚蠢的错误。我将这个private String[] getArgButtonTextsStrings = new String[0]; 更改为private String[] getArgButtonTextsStrings; 和日志System.out.println("onCreate " +" "+ Arrays.toString(getArgButtonTextsStrings)); 非常感谢您的帮助!!
    猜你喜欢
    • 1970-01-01
    • 2012-06-20
    • 2020-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-28
    • 1970-01-01
    相关资源
    最近更新 更多