【问题标题】:How to load array of string in a fragment?如何在片段中加载字符串数组?
【发布时间】:2016-01-07 06:48:54
【问题描述】:

这是主要活动中的数组

String[] items = {
            "Unit 1", "Unit 2", "Unit 3", "Unit 4", "Unit 5", "Unit 6", "Unit 7",
            "Unit 8", "Unit 9", "Unit10", "Unit 11", "Unit 12", "Unit 13"};
    ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, items);

这是我想将列表加载到片段中的 onclick 方法。

   bt2.setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View v) {
            FragmentManager fragmentManager = getSupportFragmentManager();
            android.support.v4.app.FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
            fragmentTransaction.replace(R.id.container, fragmentB);
            fragmentTransaction.addToBackStack("");
            fragmentTransaction.commit(); 

我有许多字符串数组,想为菜单中的每个按钮分配一个。 现在我应该把这段代码放在哪里?

ListView listView = (ListView) findViewById(R.id.listview);
listView.setAdapter(adapter);

【问题讨论】:

    标签: java android arrays android-fragments


    【解决方案1】:

    列表视图必须在片段内,如果你想通过点击不同的按钮将数据传递给片段,你应该这样做:

    已编辑

    重要!

    这个类只是举例(它没有遵循android开发的最佳实践)。

    public class MainActivity extends FragmentActivity implements View.OnClickListener{
    
    public static final String LISTVIEW_DATA = "myData";
    public static final String DATA_TYPE1 = "DataType1";
    public static final String DATA_TYPE2 = "DataType2";
    public static final String DATA_TYPE3 = "DataType3";
    
    Bundle bundle = null;
    
    ArrayList<String> items1 = new ArrayList<String>();
    ArrayList<String> items2 = new ArrayList<String>();
    ArrayList<String> items3 = new ArrayList<String>();
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        //set some data to the items
        items1 = generateStringData("Unit 1");
        items2 = generateStringData("Unit 2");
        items3 = generateStringData("Unit 3");
    
        Button btn1 = (Button) findViewById(R.id.button1);
        Button btn2 = (Button) findViewById(R.id.button2);
        Button btn3 = (Button) findViewById(R.id.button3);
    
        btn1.setOnClickListener(this);
        btn2.setOnClickListener(this);
        btn3.setOnClickListener(this);
    }
    
    private ArrayList<String> generateStringData(String prefix){
        ArrayList<String> temp = new ArrayList<String>();
    
        for (int i = 0; i<10; i++){
            temp.add(prefix + i);
        }
    
        return temp;
    }
    
    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.button1:
                bundle = new Bundle();
                bundle.putString(MainActivityFragment.DATA_TYPE, DATA_TYPE1);
                bundle.putStringArrayList(LISTVIEW_DATA, items1);
                break;
            case R.id.button2:
                bundle = new Bundle();
                bundle.putString(MainActivityFragment.DATA_TYPE, DATA_TYPE2);
                bundle.putStringArrayList(LISTVIEW_DATA, items2);
                break;
            case R.id.button3:
                bundle = new Bundle();
                bundle.putString(MainActivityFragment.DATA_TYPE, DATA_TYPE3);
                bundle.putStringArrayList(LISTVIEW_DATA, items3);
                break;
            default:
                break;
        }
    
        setListFragment(bundle);
    }
    
    private void setListFragment(Bundle arguments){
        Fragment fragment = new MainActivityFragment();
    
        if (arguments != null){
            fragment.setArguments(arguments);
        }
    
        FragmentManager fragmentManager = getSupportFragmentManager();
        android.support.v4.app.FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.replace(R.id.container, fragment);
        fragmentTransaction.addToBackStack("");
        fragmentTransaction.commit();
    }
    

    当您单击按钮时,此代码会将片段置于片段之上,正如您通过点击后退按钮所看到的那样,这不是一个好主意。您应该根据需要重新编写代码。

    为片段设置参数后,您必须在片段中接收数据:

    public class MainActivityFragment extends Fragment {
    
    public final static String DATA_TYPE = "DataType";
    
    private ArrayList<String> data = new ArrayList<>();
    private String dataTag = "";
    
    public MainActivityFragment() {
    }
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
        if (getArguments() != null){
            data = getArguments().getStringArrayList(MainActivity.LISTVIEW_DATA);
            dataTag = getArguments().getString(DATA_TYPE);
        }
    
    }
    
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_main, container, false);
    
        ListView listView = (ListView) rootView.findViewById(R.id.listView1);
    
        ArrayAdapter adapter = new ArrayAdapter(getActivity(), android.R.layout.simple_list_item_1, data);
    
        listView.setAdapter(adapter);
    
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int   i, long l) {
    
                switch (dataTag) {
                    case MainActivity.DATA_TYPE1:
                        //here is where you can implement your logic for type 1
                        break;
                    case MainActivity.DATA_TYPE2:
                        //here is where you can implement your logic for type 2
                        break;
                    case MainActivity.DATA_TYPE3:
                        //here is where you can implement your logic for type 3
                        break;
                    default:
                        //do something else
                        break;
                }
    
            }
        });
    
        return rootView;
    }
    

    希望对你有帮助。

    【讨论】:

    • 通过应用你的方法,屏幕上没有任何异常,如果我双击按钮它会强制关闭应用程序,并且在 logcat 中它说 Fragment 已经激活?
    • 我编辑了我的答案,所以你可以理解代码。不要忘记导入 android.support.v4.app.Fragment。
    • 谢谢伙计 :) 它起作用了 :) 我没有以正确的方式在片段中实现方法,非常感谢你\
    • 很高兴能帮上忙 :)
    • 我还有一个问题,如果你能回答,我如何将 onitemclick 分别分配给这些数组列表的所有项目?现在,如果我将某个动作分配给第 1 单元的练习 1,它将被分配给所有单元的练习,即单元 1-练习 1,单元 2 练习 1,依此类推
    【解决方案2】:

    首先listview 必须是片段布局的一部分,然后你可以在片段的onCreateView() 方法中编写它。

    onCreateView(LayoutInflater inflater, ViewGroup group, Bundle savedInstance){
    View v = inflater.inflate(R.layout.fragment_layout, container, false);
    String[] items = {"Unit 1", "Unit 2", "Unit 3", "Unit 4", "Unit 5", "Unit 6", "Unit 7", "Unit 8", "Unit 9", "Unit10", "Unit 11", "Unit 12", "Unit 13"};
    ArrayAdapter adapter = new ArrayAdapter(getActivity(), android.R.layout.simple_list_item_1, items);
    
    ListView listView = (ListView) v.findViewById(R.id.listview);
    listView.setAdapter(adapter);
    return v;
    }
    

    【讨论】:

    • listview 是片段布局的一部分 bt 问题是我想在每次按下按钮时加载差异数组列表,所以我不想在 oncreateview 中写它,无论如何我可以将它分配给按钮所以片段会为每次按下按钮加载 diff Arraylist?
    • 可以在创建fragment对象后将array传入fragment,可以直接在onCreateView()中获取并添加到ArrayAdapter对象中。阅读本文[stackoverflow.com/questions/17436298/… 了解如何将参数传递给片段。
    • 你能举个例子吗?我已经阅读了谷歌和这里的所有内容,但仍然无法解决它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-17
    相关资源
    最近更新 更多