Android 如何在片段内以编程方式使用xml布局创建视图?

Android 如何在片段内以编程方式使用xml布局创建视图?,android,android-layout,android-fragments,viewgroup,Android,Android Layout,Android Fragments,Viewgroup,我有一些布局,我需要创建许多视图,以将tham添加到片段内部的gridLayout中 我现在有: ArrayList<Tables> tables; ArrayList<View> tableList = new ArrayList<>(); tables = parsedArray.get(0).getTables(); GridLayout gridLayout = (GridLayo

我有一些布局,我需要创建许多视图,以将tham添加到片段内部的gridLayout中

我现在有:

ArrayList<Tables> tables;
            ArrayList<View> tableList = new ArrayList<>();
            tables = parsedArray.get(0).getTables();
            GridLayout gridLayout = (GridLayout) getView().findViewById(R.id.grid_layout);

            for (int i = 0; i < tables.size(); i++) {
                tableList.add(getView().findViewById(R.id.table_layout));
                //TextView textView = (TextView) tableList.get(i).findViewById(R.id.table_number);
                //textView.setText(tables.get(i).getTableNumber());
                GridLayout.Spec row = GridLayout.spec(i / 5);
                GridLayout.Spec col = GridLayout.spec(i);
                GridLayout.LayoutParams params = new GridLayout.LayoutParams(row, col);
                gridLayout.addView(tableList.get(i), i, params);
            }
        }
片段代码:

public static class tablesFragment extends Fragment {

    private VolleySinglton volleySinglton;
    private RequestQueue requestQueue;

    public static tablesFragment getInstance(int position) {
        tablesFragment myTablesFragment = new tablesFragment();
        Bundle args = new Bundle();
        args.putInt("position", position);
        myTablesFragment.setArguments(args);
        return myTablesFragment;
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {


        View layout = inflater.inflate(R.layout.fragment_1, container, false);
        GridLayout gridLayout = (GridLayout) layout.findViewById(R.id.grid_layout);

        volleySinglton = VolleySinglton.returnInstance();
        requestQueue = volleySinglton.getRequestQueue();
        JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET,
                url,
                (String) null,
                new Response.Listener<JSONObject>() {

                    @Override
                    public void onResponse(JSONObject response) {

                        ArrayList<RoomsClass> parsedArray = parseRoomsResponse(response);
                        updateViews(parsedArray);
                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                if (error instanceof TimeoutError) {

                }
            }
        });

        requestQueue.add(jsonObjectRequest);

        return layout;
    }

    private void updateViews(ArrayList<RoomsClass> parsedArray) {

        // Extract relevant data from the array

        if (parsedArray == null || parsedArray.isEmpty()) {
        } else {

            ArrayList<Tables> tables;
            ArrayList<View> tableList = new ArrayList<>();
            tables = parsedArray.get(0).getTables();
            GridLayout gridLayout = (GridLayout) getView().findViewById(R.id.grid_layout);

            for (int i = 0; i < tables.size(); i++) {
                tableList.add(getView().findViewById(R.id.table_layout));
                //TextView textView = (TextView) tableList.get(i).findViewById(R.id.table_number);
                //textView.setText(tables.get(i).getTableNumber());
                GridLayout.Spec row = GridLayout.spec(i / 5);
                GridLayout.Spec col = GridLayout.spec(i);
                GridLayout.LayoutParams params = new GridLayout.LayoutParams(row, col);
                gridLayout.addView(tableList.get(i), i, params);
            }
        }

        // Replace the place holders in the relevant views

    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

    }


    @Override
    public void onResume() {
        super.onResume();

    }

    public interface VolleyCallback {
        void onSuccess(ArrayList<RoomsClass> result);
    }

    private ArrayList<RoomsClass> parseRoomsResponse(JSONObject response) {

        ArrayList<RoomsClass> roomsArray = new ArrayList<>();
        try {

            JSONArray rooms = response.getJSONArray("rooms");

            for (int i = 0; i < rooms.length(); i++) {
                JSONObject currentRoom = rooms.getJSONObject(i);
                RoomsClass room = new RoomsClass();
                room.setRoomId(currentRoom.getInt("room_id"));
                room.setRoomLabel(currentRoom.getString("label"));

                JSONArray tables = currentRoom.getJSONArray("tables");
                for (int j = 0; j < tables.length(); j++) {
                    JSONObject currentTable = tables.getJSONObject(j);
                    room.addTable(currentTable.getInt("table_id"), currentTable.getInt("table_number"));
                }
                roomsArray.add(room);
            }
        } catch (JSONException e) {
            Toast.makeText(getActivity(), e.toString(), Toast.LENGTH_LONG).show();
        }

        return roomsArray;
    }
}
当我尝试添加视图时,一切正常

附言。
我还没有结束这个问题,可能有一些麻烦。

给我看看你添加到qestion中的所有片段编解码器。。。而且它看起来很糟糕(
findviewbyd()
for循环内部可能返回
null
,这可能意味着布局中还没有具有该ID的视图。但是如果它没有返回null,那么如果
i
大于1,您将遇到问题,因为它每次都会找到相同的视图并尝试添加该视图,但第二个add with会抛出异常since它已经被添加了。那么我如何添加一个不总是相同的新视图呢?
public static class tablesFragment extends Fragment {

    private VolleySinglton volleySinglton;
    private RequestQueue requestQueue;

    public static tablesFragment getInstance(int position) {
        tablesFragment myTablesFragment = new tablesFragment();
        Bundle args = new Bundle();
        args.putInt("position", position);
        myTablesFragment.setArguments(args);
        return myTablesFragment;
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {


        View layout = inflater.inflate(R.layout.fragment_1, container, false);
        GridLayout gridLayout = (GridLayout) layout.findViewById(R.id.grid_layout);

        volleySinglton = VolleySinglton.returnInstance();
        requestQueue = volleySinglton.getRequestQueue();
        JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET,
                url,
                (String) null,
                new Response.Listener<JSONObject>() {

                    @Override
                    public void onResponse(JSONObject response) {

                        ArrayList<RoomsClass> parsedArray = parseRoomsResponse(response);
                        updateViews(parsedArray);
                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                if (error instanceof TimeoutError) {

                }
            }
        });

        requestQueue.add(jsonObjectRequest);

        return layout;
    }

    private void updateViews(ArrayList<RoomsClass> parsedArray) {

        // Extract relevant data from the array

        if (parsedArray == null || parsedArray.isEmpty()) {
        } else {

            ArrayList<Tables> tables;
            ArrayList<View> tableList = new ArrayList<>();
            tables = parsedArray.get(0).getTables();
            GridLayout gridLayout = (GridLayout) getView().findViewById(R.id.grid_layout);

            for (int i = 0; i < tables.size(); i++) {
                tableList.add(getView().findViewById(R.id.table_layout));
                //TextView textView = (TextView) tableList.get(i).findViewById(R.id.table_number);
                //textView.setText(tables.get(i).getTableNumber());
                GridLayout.Spec row = GridLayout.spec(i / 5);
                GridLayout.Spec col = GridLayout.spec(i);
                GridLayout.LayoutParams params = new GridLayout.LayoutParams(row, col);
                gridLayout.addView(tableList.get(i), i, params);
            }
        }

        // Replace the place holders in the relevant views

    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

    }


    @Override
    public void onResume() {
        super.onResume();

    }

    public interface VolleyCallback {
        void onSuccess(ArrayList<RoomsClass> result);
    }

    private ArrayList<RoomsClass> parseRoomsResponse(JSONObject response) {

        ArrayList<RoomsClass> roomsArray = new ArrayList<>();
        try {

            JSONArray rooms = response.getJSONArray("rooms");

            for (int i = 0; i < rooms.length(); i++) {
                JSONObject currentRoom = rooms.getJSONObject(i);
                RoomsClass room = new RoomsClass();
                room.setRoomId(currentRoom.getInt("room_id"));
                room.setRoomLabel(currentRoom.getString("label"));

                JSONArray tables = currentRoom.getJSONArray("tables");
                for (int j = 0; j < tables.length(); j++) {
                    JSONObject currentTable = tables.getJSONObject(j);
                    room.addTable(currentTable.getInt("table_id"), currentTable.getInt("table_number"));
                }
                roomsArray.add(room);
            }
        } catch (JSONException e) {
            Toast.makeText(getActivity(), e.toString(), Toast.LENGTH_LONG).show();
        }

        return roomsArray;
    }
}
View view = getActivity().getLayoutInflater().inflate(R.layout.table_layout, gridLayout, false);
                tableList.add(view);