活动介绍
file-type

自定义Android Spinner控件,设置默认选项及高度自定义

下载需积分: 5 | 3KB | 更新于2024-10-19 | 21 浏览量 | 12 下载量 举报 1 收藏
download 立即下载
Spinner控件是Android开发中用于显示下拉列表的视图组件。通过这个自定义Spinner,开发者可以为Spinner设置一个预设的默认值,并且能够根据需求自定义下拉列表的显示内容以及选中项的显示方式。这种自定义控件使得界面更加灵活和个性化,能够提高用户体验。 在Android开发中,Spinner控件通常是用来提供用户一个选择列表,用户可以从列表中选择一个选项,而其他选项则会被隐藏。Spinner可以在有限的空间内显示多于一个的选项,因此它比单选按钮组更为节省空间。在实现上,Spinner通常是通过适配器(Adapter)来填充数据的,适配器负责将数据绑定到UI组件上。 这个自定义Spinner控件的特点主要包括: 1. 支持设置默认值:开发者可以在Spinner中预先设置一个默认的选项值,这样在用户打开应用时,Spinner会展示这个预设的值,而不是一个空的或者固定的默认值。这为用户提供了更直接的信息提示,同时也使得应用在用户体验上显得更加友好。 2. 下拉选框自定义:开发者可以根据实际需求来自定义下拉列表中的各个选项。例如,可以修改下拉选项的字体、颜色、大小等样式,甚至可以修改选项的布局结构,使其更符合应用的设计风格。 3. 显示框自定义:除了下拉选项之外,用户在界面上看到的当前选中项也可以进行自定义。这意味着你可以改变显示框的文本样式、背景色、边距、对齐方式等,以实现更多样化的界面效果。 4. 使用简单:该自定义控件使用非常简单,开发者只需要将其复制粘贴到自己的项目中,按照文档说明进行相应的配置即可使用。 5. 高度可扩展:虽然这个自定义Spinner提供了基本的默认值设置和自定义选项,但同时也允许开发者根据具体的需求进行功能扩展,实现更多高级功能。 为了实现这样的自定义Spinner,开发者需要具备一定的Android开发基础,了解如何创建自定义控件,熟悉适配器的使用,以及对Android UI布局和样式的自定义有一定的掌握。此外,对于不同版本的Android系统可能存在的兼容性问题也需要进行考虑,确保控件能够在不同的设备和系统版本上正常工作。 通过结合这个自定义Spinner控件,开发者可以创建更加专业和用户友好的Android应用,提高应用的可用性和用户的满意度。"

相关推荐

filetype

D Shutting down VM 2025-06-13 01:48:30.658 24649-24649 AndroidRuntime com.example.kucun2 E FATAL EXCEPTION: main Process: com.example.kucun2, PID: 24649 java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.Object.toString()' on a null object reference at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:454) at android.widget.ArrayAdapter.getView(ArrayAdapter.java:416) at com.example.kucun2.function.Adapter$SafeSpinnerAdapter.getView(Adapter.java:45) at android.widget.AbsSpinner.onMeasure(AbsSpinner.java:206) at android.widget.Spinner.onMeasure(Spinner.java:622) at androidx.appcompat.widget.AppCompatSpinner.onMeasure(AppCompatSpinner.java:444) at android.view.View.measure(View.java:29007) at android.widget.LinearLayout.measureHorizontal(LinearLayout.java:1226) at android.widget.LinearLayout.onMeasure(LinearLayout.java:728) at android.view.View.measure(View.java:29007) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:7132) at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1613) at android.widget.LinearLayout.measureVertical(LinearLayout.java:883) at android.widget.LinearLayout.onMeasure(LinearLayout.java:726) at android.view.View.measure(View.java:29007) at android.widget.ScrollView.measureChildWithMargins(ScrollView.java:1641) at android.widget.FrameLayout.onMeasure(FrameLayout.java:205) at android.widget.ScrollView.onMeasure(ScrollView.java:559) at android.view.View.measure(View.java:29007)package com.example.kucun2.function; import android.content.Context; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.Spinner; import android.widget.TextView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.example.kucun2.entity.Bancai; import com.example.kucun2.entity.Caizhi; import com.example.kucun2.entity.Chanpin; import com.example.kucun2.entity.Dingdan; import com.example.kucun2.entity.Mupi; import com.example.kucun2.entity.Zujian; import java.util.List; public class Adapter { // 安全适配器基类,处理公共逻辑 private static abstract class SafeSpinnerAdapter<T> extends ArrayAdapter<T> { public SafeSpinnerAdapter(Context context, int resource, List<T> objects) { super(context, resource, objects); } @Override public View getDropDownView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { View view = super.getDropDownView(position, convertView, parent); TextView textView = view.findViewById(android.R.id.text1); T item = getItem(position); // 处理空对象 String text = (item != null) ? formatDropdownText(item) : "空项"; textView.setText(text); return view; } @NonNull @Override public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { View view = super.getView(position, convertView, parent); TextView textView = view.findViewById(android.R.id.text1); T item = getItem(position); // 处理空对象 String text = (item != null) ? formatDisplayText(item) : "请选择"; textView.setText(text); return view; } // 在具体适配器中确保返回非空字符串 protected abstract String formatDisplayText(T item); protected abstract String formatDropdownText(T item); } // 1. 材质适配器 public static ArrayAdapter<Caizhi> setupCaizhiSpinner(Spinner spinner, List<Caizhi> data, Context context) { ArrayAdapter<Caizhi> adapter = new SafeSpinnerAdapter<Caizhi>(context, android.R.layout.simple_spinner_item, data) { @Override protected String formatDisplayText(Caizhi item) { return item != null ? item.getName() : "请选择材质"; } @Override protected String formatDropdownText(Caizhi item) { return item != null ? item.getName() : ""; } }; adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinner.setAdapter(adapter); return adapter; } // 2. 木皮适配器 public static void setupMupiSpinner(Spinner spinner, List<Mupi> data, Context context) { ArrayAdapter<Mupi> adapter = new SafeSpinnerAdapter<Mupi>(context, android.R.layout.simple_spinner_item, data) { @Override protected String formatDisplayText(Mupi item) { return item != null ? item.formatMupiDisplay() : "请选择木皮"; } @Override protected String formatDropdownText(Mupi item) { return item != null ? item.formatMupiDisplay() : ""; } }; adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinner.setAdapter(adapter); } // 3. 板材适配器 public static void setupBancaiSpinners(Spinner spinner, List<Bancai> data, Context context) { ArrayAdapter<Bancai> adapter = new SafeSpinnerAdapter<Bancai>(context, android.R.layout.simple_spinner_item, data) { @Override protected String formatDisplayText(Bancai item) { return item != null ? item.TableText() : "请选择板材"; } @Override protected String formatDropdownText(Bancai item) { return item != null ? item.TableText() : ""; } }; adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinner.setAdapter(adapter); } // 4. 订单适配器 public static void setupDingdanSpinner(Spinner spinner, List<Dingdan> data, Context context) { ArrayAdapter<Dingdan> adapter = new SafeSpinnerAdapter<Dingdan>(context, android.R.layout.simple_spinner_item, data) { @Override protected String formatDisplayText(Dingdan item) { return item != null ? item.getNumber() : "请选择"; } @Override protected String formatDropdownText(Dingdan item) { return item != null ? item.getNumber() : "请选择"; } }; adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinner.setAdapter(adapter); } // 5. 产品适配器 public static void setupChanpinSpinner(Spinner spinner, List<Chanpin> data, Context context) { ArrayAdapter<Chanpin> adapter = new SafeSpinnerAdapter<Chanpin>(context, android.R.layout.simple_spinner_item, data) { @Override protected String formatDisplayText(Chanpin item) { return item != null ? item.getBianhao() : "请选择"; } @Override protected String formatDropdownText(Chanpin item) { return item != null ? item.getBianhao() : "请选择"; } }; adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinner.setAdapter(adapter); } // 6. 组件适配器 public static void setupZujianSpinner(Spinner spinner, List<Zujian> data, Context context) { ArrayAdapter<Zujian> adapter = new SafeSpinnerAdapter<Zujian>(context, android.R.layout.simple_spinner_item, data) { @Override protected String formatDisplayText(Zujian item) { return item != null ? item.getName() : "请选择"; } @Override protected String formatDropdownText(Zujian item) { return item != null ? item.getName() : "请选择"; } }; adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinner.setAdapter(adapter); } }

filetype

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:padding="16dp"> <EditText android:id="@+id/et_zujian_name" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="输入组件名称"/> <EditText android:id="@+id/et_bancai_name" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="输入板材名称(可选)" android:layout_marginTop="8dp"/> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="材质选择" android:layout_marginTop="16dp"/> <Spinner android:id="@+id/spinner_caizhi" android:layout_width="match_parent" android:layout_height="wrap_content"/> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="木皮1" android:layout_marginTop="8dp"/> <Spinner android:id="@+id/spinner_mupi1" android:layout_width="match_parent" android:layout_height="wrap_content"/> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="木皮2(可选)" android:layout_marginTop="8dp"/> <Spinner android:id="@+id/spinner_mupi2" android:layout_width="match_parent" android:layout_height="wrap_content"/> </LinearLayout> // 添加木皮预览标签 TextView previewMupi1 = dialogView.findViewById(R.id.tv_preview_mupi1); TextView previewMupi2 = dialogView.findViewById(R.id.tv_preview_mupi2);

filetype

package com.example.kucun2.ui.jinhuo; import static android.content.ContentValues.TAG; import android.app.AlertDialog; import android.app.DatePickerDialog; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.EditText; import android.widget.LinearLayout; import android.widget.MultiAutoCompleteTextView; import android.widget.RadioGroup; import android.widget.SearchView; import android.widget.Spinner; import android.widget.TextView; import android.widget.Toast; import androidx.annotation.NonNull; import androidx.fragment.app.Fragment; import com.example.kucun2.R; import com.example.kucun2.entity.*; import com.example.kucun2.entity.data.Data; import com.example.kucun2.function.Adapter; import com.google.android.material.textfield.TextInputEditText; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.List; import java.util.Locale; import java.util.Objects; import java.util.Random; public class AddInventoryFragment extends Fragment { private Spinner spinnerDingdan, spinnerChanpin, spinnerZujian, spinnerBancai; private EditText etShuliang; private RadioGroup rgType; private Dingdan selectedDingdan; private Chanpin selectedChanpin; private Zujian selectedZujian; private Bancai selectedBancai; // 创建新订单产品组件按钮 private Button btnNewDingdan, btnAddChanpin, btnAddZujian; // 日期格式化 private final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()); /** * 初始化 * @param inflater The LayoutInflater object that can be used to inflate * any views in the fragment, * @param container If non-null, this is the parent view that the fragment's * UI should be attached to. The fragment should not add the view itself, * but this can be used to generate the LayoutParams of the view. * @param savedInstanceState If non-null, this fragment is being re-constructed * from a previous saved state as given here. * * @return */ @Override public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_add_inventory, container, false); // 初始化UI组件 spinnerDingdan = view.findViewById(R.id.spinner_dingdan); spinnerChanpin = view.findViewById(R.id.spinner_chanpin); spinnerZujian = view.findViewById(R.id.spinner_zujian); spinnerBancai = view.findViewById(R.id.spinner_bancai); etShuliang = view.findViewById(R.id.et_shuliang); rgType = view.findViewById(R.id.rg_type); Button btnSubmit = view.findViewById(R.id.btn_submit); // 初始化新按钮 btnNewDingdan = view.findViewById(R.id.btn_new_dingdan); btnAddChanpin = view.findViewById(R.id.btn_add_chanpin); btnAddZujian = view.findViewById(R.id.btn_add_zujian); // 设置按钮点击事件 btnNewDingdan.setOnClickListener(v -> createNewDingdan()); btnAddChanpin.setOnClickListener(v -> showAddChanpinDialog()); btnAddZujian.setOnClickListener(v -> addZujianToChanpin()); // 设置订单选择器 setupDingdanSpinner(); // 提交按钮点击事件 btnSubmit.setOnClickListener(v -> addInventoryRecord()); return view; } private void setupDingdanSpinner() { Adapter.setupDingdanSpinner(spinnerDingdan,Data.dingdans,getContext()); spinnerDingdan.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { selectedDingdan = (Dingdan) parent.getItemAtPosition(position); setupChanpinSpinner(selectedDingdan); } @Override public void onNothingSelected(AdapterView<?> parent) {} }); } private void setupChanpinSpinner(Dingdan dingdan) { // 获取该订单的产品列表 List<Chanpin> chanpins = new ArrayList<>(); if (dingdan != null && dingdan.getDingdanChanpin() != null) { for (Dingdan_Chanpin dc : dingdan.getDingdanChanpin()) { if (dc != null && dc.getChanpin() != null) { chanpins.add(dc.getChanpin()); } } } // 设置产品下拉框适配器 Adapter.setupChanpinSpinner(spinnerChanpin, chanpins, getContext()); // 设置产品选择监听器 spinnerChanpin.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { selectedChanpin = (Chanpin) parent.getItemAtPosition(position); if (selectedChanpin != null) { setupZujianSpinner(selectedChanpin); } } @Override public void onNothingSelected(AdapterView<?> parent) {} }); } /** * 组件下拉框刷新 * @param chanpin */ private void setupZujianSpinner(Chanpin chanpin) { // 获取该产品的组件列表 List<Zujian> zujians = new ArrayList<>(); for (Chanpin_Zujian cz : chanpin.getChanpinZujian()) { zujians.add(cz.getZujian()); } Adapter.setupZujianSpinner(spinnerZujian,zujians,getContext()); spinnerZujian.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { selectedZujian = (Zujian) parent.getItemAtPosition(position); setupBancaiSpinner(selectedChanpin, selectedZujian); } @Override public void onNothingSelected(AdapterView<?> parent) {} }); } /** * 板材刷新 * @param chanpin * @param zujian */ private void setupBancaiSpinner(Chanpin chanpin, Zujian zujian) { // 获取该组件关联的板材 List<Bancai> bancais = new ArrayList<>(); for (Chanpin_Zujian cz : chanpin.getChanpinZujian()) { if (cz.getZujian().getId().equals(zujian.getId())) { bancais.add(cz.getBancai()); } } Adapter.setupBancaiSpinners(spinnerBancai,bancais,getContext()); spinnerBancai.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { selectedBancai = (Bancai) parent.getItemAtPosition(position); } @Override public void onNothingSelected(AdapterView<?> parent) {} }); } // ... addInventoryRecord和createRecord方法保持不变 ... private void addInventoryRecord() { // 验证必填项 if (selectedDingdan == null || selectedChanpin == null || selectedZujian == null || selectedBancai == null) { Toast.makeText(getContext(), "请选择订单、产品、组件和板材", Toast.LENGTH_SHORT).show(); return; } String shuliangStr = etShuliang.getText().toString().trim(); if (shuliangStr.isEmpty()) { Toast.makeText(getContext(), "请输入数量", Toast.LENGTH_SHORT).show(); return; } // 解析数量 int shuliang; try { shuliang = Integer.parseInt(shuliangStr); } catch (NumberFormatException e) { Toast.makeText(getContext(), "请输入有效的数量", Toast.LENGTH_SHORT).show(); return; } // 确定操作类型(进货或消耗) boolean isJinhuo = rgType.getCheckedRadioButtonId() == R.id.rb_jinhuo; // 实际开发中应从登录信息获取当前用户 User currentUser = new User(1, "当前用户", "user", "password",1); // 创建记录 createRecord(selectedDingdan, selectedChanpin, selectedZujian, selectedBancai, shuliang, isJinhuo, currentUser); Toast.makeText(getContext(), "记录添加成功", Toast.LENGTH_SHORT).show(); etShuliang.setText(""); // 清空输入框 } private void createRecord(Dingdan dingdan, Chanpin chanpin, Zujian zujian, Bancai bancai, int shuliang, boolean isJinhuo, User user) { if (isJinhuo) { // 创建进货记录 Jinhuo jinhuo = new Jinhuo(); jinhuo.setId(Data.jinhuoList.size() + 1); jinhuo.setDingdan(dingdan); jinhuo.setChanpin(chanpin); jinhuo.setZujian(zujian); jinhuo.setBancai(bancai); jinhuo.setShuliang(shuliang); jinhuo.setDate(new Date()); jinhuo.setUser(user); Data.jinhuoList.add(jinhuo); } else { // 消耗数量转为负数 shuliang = -shuliang; } // 更新库存 updateKucun(bancai, shuliang); } private void updateKucun(Bancai bancai, int changeAmount) { // 查找现有库存记录 for (Kucun k : Data.kucuns) { if (k.getBancai().getId().equals(bancai.getId())) { k.setShuliang(k.getShuliang() + changeAmount); return; } } // 如果没有找到库存记录,创建新的 Kucun newKucun = new Kucun(); newKucun.setId(Data.kucuns.size() + 1); newKucun.setBancai(bancai); newKucun.setShuliang(Math.max(changeAmount, 0)); // 确保不为负 Data.kucuns.add(newKucun); } // 新建订单方法 private void createNewDingdan() { showNewDingdanDialog(); } /** * 向订单添加产品 * @param chanpin */ private void addChanpinToDingdan(Chanpin chanpin) { if (selectedDingdan == null||chanpin==null) { Toast.makeText(getContext(), "请先选择订单", Toast.LENGTH_SHORT).show(); return; } Log.d(TAG, "addChanpinToDingdan: "); // 检查产品是否已在订单中 for (Dingdan_Chanpin dc : selectedDingdan.getDingdanChanpin()) { if (dc.getChanpin().getId().equals(chanpin.getId())) { Toast.makeText(getContext(), "该产品已添加到订单", Toast.LENGTH_SHORT).show(); return; } } // 添加到当前订单的产品列表 Dingdan_Chanpin dc = new Dingdan_Chanpin(); //dc.setId(selectedDingdan.getDingdanChanpin().size() + 1); dc.setChanpin(chanpin); dc.setDingdan(selectedDingdan); selectedDingdan.getDingdanChanpin().add(dc); // 刷新产品下拉框 setupChanpinSpinner(selectedDingdan); // 选中新添加的产品 spinnerChanpin.setSelection(selectedDingdan.getDingdanChanpin().size() - 1); Toast.makeText(getContext(), "产品添加成功", Toast.LENGTH_SHORT).show(); } // 为当前产品添加组件 private void addZujianToChanpin() { if (selectedChanpin == null) { Toast.makeText(getContext(), "请先选择产品", Toast.LENGTH_SHORT).show(); return; } // // 创建新组件(示例) // Zujian newZujian = new Zujian(); // newZujian.setId( (Data.zujians.size() + 1)); // newZujian.setName("新组件" + System.currentTimeMillis()); // // // 添加到全局列表 // Data.zujians.add(newZujian); // // // 添加到当前产品的组件列表 // Chanpin_Zujian cz = new Chanpin_Zujian(); // cz.setId(selectedChanpin.getZujians().size() + 1); // cz.setZujian(newZujian); // cz.setChanpin(selectedChanpin); // selectedChanpin.getZujians().add(cz); // // // 刷新组件下拉框 // setupZujianSpinner(selectedChanpin); // spinnerZujian.setSelection(selectedChanpin.getZujians().size() - 1); // // Toast.makeText(getContext(), "组件添加成功", Toast.LENGTH_SHORT).show(); showCreateZujianDialog(); } // 新建订单对话框 /*** * 新建订单对话框 */ private void showNewDingdanDialog() { AlertDialog.Builder builder = new AlertDialog.Builder(requireContext()); builder.setTitle("新建订单"); // 加载布局 View dialogView = LayoutInflater.from(requireContext()).inflate(R.layout.dialog_new_dingdan, null); EditText etOrderNumber = dialogView.findViewById(R.id.et_order_number); EditText etOrderDate = dialogView.findViewById(R.id.et_order_date); EditText etDeliveryDate = dialogView.findViewById(R.id.et_delivery_date); Button btnPickOrderDate = dialogView.findViewById(R.id.btn_pick_order_date); Button btnPickDeliveryDate = dialogView.findViewById(R.id.btn_pick_delivery_date); // 设置今日日期作为默认值 Date today = new Date(); etOrderDate.setText(dateFormat.format(today)); // 日期选择监听器 DatePickerDialog.OnDateSetListener orderDateListener = (view, year, month, dayOfMonth) -> { Calendar cal = Calendar.getInstance(); cal.set(year, month, dayOfMonth); etOrderDate.setText(dateFormat.format(cal.getTime())); }; DatePickerDialog.OnDateSetListener deliveryDateListener = (view, year, month, dayOfMonth) -> { Calendar cal = Calendar.getInstance(); cal.set(year, month, dayOfMonth); etDeliveryDate.setText(dateFormat.format(cal.getTime())); }; // 下单日期选择按钮 btnPickOrderDate.setOnClickListener(v -> { Calendar cal = Calendar.getInstance(); new DatePickerDialog(requireContext(), orderDateListener, cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH)) .show(); }); /** * / 出货日期选择按钮 */ btnPickDeliveryDate.setOnClickListener(v -> { Calendar cal = Calendar.getInstance(); new DatePickerDialog(requireContext(), deliveryDateListener, cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH)) .show(); }); builder.setView(dialogView); builder.setPositiveButton("创建", (dialog, which) -> { String orderNumber = etOrderNumber.getText().toString().trim(); String orderDateStr = etOrderDate.getText().toString(); String deliveryDateStr = etDeliveryDate.getText().toString(); for (Dingdan dingdan:Data.dingdans ) { if (dingdan.getNumber()==null||orderNumber==null){ Log.d(TAG, "showNewDingdanDialog: "); return; } if(dingdan.getNumber().equals(orderNumber)){ Toast.makeText(getContext(), "已有该订单号", Toast.LENGTH_SHORT).show(); return; } } // 验证输入 if (orderNumber.isEmpty()) { Toast.makeText(getContext(), "请输入订单号", Toast.LENGTH_SHORT).show(); return; } try { // 解析日期 Date orderDate = dateFormat.parse(orderDateStr); Date deliveryDate = deliveryDateStr.isEmpty() ? null : dateFormat.parse(deliveryDateStr); // 创建订单 createAndSaveDingdan(orderNumber, orderDate, deliveryDate); } catch (ParseException e) { Toast.makeText(getContext(), "日期格式错误", Toast.LENGTH_SHORT).show(); } }); builder.setNegativeButton("取消", null); builder.show(); } /** * 创建并保存订单 */ private void createAndSaveDingdan(String orderNumber, Date orderDate, Date deliveryDate) { Dingdan newDingdan = new Dingdan(); newDingdan.setId(Data.dingdans.size() + 1); newDingdan.setNumber(orderNumber); newDingdan.setXiadan(orderDate); newDingdan.setJiaohuo(deliveryDate); newDingdan.setDingdanChanpin(new ArrayList<>()); newDingdan.setDingdanChanpinZujian(new ArrayList<>()); Data.dingdans.add(newDingdan); // 刷新下拉框 setupDingdanSpinner(); spinnerDingdan.setSelection(Data.dingdans.size() - 1); Toast.makeText(getContext(), "新建订单成功", Toast.LENGTH_SHORT).show(); } /** * 显示添加产品弹窗 */ private void showAddChanpinDialog() { AlertDialog.Builder builder = new AlertDialog.Builder(requireContext()); builder.setTitle("添加产品到订单"); // 加载布局 View dialogView = LayoutInflater.from(requireContext()).inflate(R.layout.dialog_add_chanpin, null); Spinner spinnerChanpinSelection = dialogView.findViewById(R.id.spinner_chanpin_selection); Button btnNewChanpin = dialogView.findViewById(R.id.btn_new_chanpin); // 设置产品下拉框 if (Data.chanpins == null || Data.chanpins.isEmpty()) { Toast.makeText(getContext(), "没有可用的产品,请先创建产品", Toast.LENGTH_SHORT).show(); return; } Adapter.setupChanpinSpinner(spinnerChanpinSelection, Data.chanpins, getContext()); // 新建产品按钮点击事件 btnNewChanpin.setOnClickListener(v -> { showNewChanpinDialog(() -> { // 新建产品后刷新下拉框 Adapter.setupChanpinSpinner(spinnerChanpinSelection, Data.chanpins, getContext()); // 默认选中新建的产品 spinnerChanpinSelection.setSelection(Data.chanpins.size() - 1); }); }); builder.setView(dialogView); builder.setPositiveButton("添加", (dialog, which) -> { Chanpin selectedChanpin = (Chanpin) spinnerChanpinSelection.getSelectedItem(); if (selectedChanpin == null) { Toast.makeText(getContext(), "请选择一个产品", Toast.LENGTH_SHORT).show(); return; } // 将选中的产品添加到当前订单 addChanpinToDingdan(selectedChanpin); }); builder.setNegativeButton("取消", null); builder.show(); } /** * 显示新建产品弹窗 * @param refreshCallback 新建后的回调,用于刷新产品列表 */ private void showNewChanpinDialog(Runnable refreshCallback) { AlertDialog.Builder builder = new AlertDialog.Builder(requireContext()); builder.setTitle("新建产品"); View dialogView = LayoutInflater.from(requireContext()).inflate(R.layout.dialog_new_chanpin, null); EditText etChanpinName = dialogView.findViewById(R.id.et_chanpin_name); builder.setView(dialogView); builder.setPositiveButton("创建", (dialog, which) -> { String chanpinName = etChanpinName.getText().toString().trim(); if (chanpinName.isEmpty()) { Toast.makeText(getContext(), "请输入产品名称", Toast.LENGTH_SHORT).show(); return; } // 检查名称是否重复 for (Chanpin cp : Data.chanpins) { if (cp.getBianhao().equals(chanpinName)) { Toast.makeText(getContext(), "产品名称重复", Toast.LENGTH_SHORT).show(); return; } } // 创建新产品 Chanpin newChanpin = new Chanpin(); newChanpin.setId(Data.chanpins.size() + 1); newChanpin.setBianhao(chanpinName); newChanpin.setChanpinZujian(new ArrayList<>()); Data.chanpins.add(newChanpin); refreshCallback.run(); Toast.makeText(getContext(), "产品创建成功", Toast.LENGTH_SHORT).show(); }); builder.setNegativeButton("取消", null); builder.show(); } /** * 添加新组件 */ private void showCreateZujianDialog() { AlertDialog.Builder builder = new AlertDialog.Builder(requireContext()); builder.setTitle("添加新组件"); // 创建自定义布局 View dialogView = LayoutInflater.from(requireContext()).inflate(R.layout.dialog_create_zujian_bancai, null); EditText etZujianName = dialogView.findViewById(R.id.et_zujian_name); Spinner spinnerbancai = dialogView.findViewById(R.id.spinner_bancai); SearchView searchBancai = dialogView.findViewById(R.id.search_bancai); Button btnAddBancai = dialogView.findViewById(R.id.btn_add_bancai); // 设置添加板材按钮点击事件 btnAddBancai.setOnClickListener(v -> { // 弹出添加板材的弹窗,并传入当前Spinner用于刷新 showCreateBancaiDialog(spinnerbancai); }); // 板材适配器 Adapter.setupBancaiSpinners(spinnerbancai,Data.bancais,getContext()); // 设置搜索功能 searchBancai.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String query) { return false; } @Override public boolean onQueryTextChange(String newText) { // 过滤板材列表 List<Bancai> filteredList = new ArrayList<>(); for (Bancai bancai : Data.bancais) { if ( bancai.TableText().toLowerCase().contains(newText.toLowerCase())) { filteredList.add(bancai); } } // 板材适配器 Adapter.setupBancaiSpinners(spinnerbancai,filteredList,getContext()); return true; } }); // 添加木皮预览标签 builder.setView(dialogView); builder.setPositiveButton("创建", (dialog, which) -> { // 获取用户输入 String zujianName = etZujianName.getText().toString().trim(); Bancai selectedBancai = (Bancai) spinnerbancai.getSelectedItem(); if (zujianName.isEmpty()) { Toast.makeText(getContext(), "请输入组件名称", Toast.LENGTH_SHORT).show(); return; } // 创建新组件 Zujian newZujian = new Zujian(); newZujian.setId(Data.zujians.size() + 1); newZujian.setName(zujianName); // 创建新板材 // 添加到全局列表 Data.zujians.add(newZujian); // 添加到当前产品的组件列表 Chanpin_Zujian cz = new Chanpin_Zujian(); cz.setZujian(newZujian); cz.setBancai(selectedBancai); // 关联新创建的板材 cz.setChanpin(selectedChanpin); selectedChanpin.getChanpinZujian().add(cz); // 刷新组件下拉框 setupZujianSpinner(selectedChanpin); spinnerZujian.setSelection(selectedChanpin.getChanpinZujian().size() - 1); Toast.makeText(getContext(), "组件和板材添加成功", Toast.LENGTH_SHORT).show(); }); builder.setNegativeButton("取消", null); builder.show(); } // 显示创建板材的弹窗 private void showCreateBancaiDialog(Spinner spinnerToRefresh) { AlertDialog.Builder builder = new AlertDialog.Builder(requireContext()); builder.setTitle("添加新板材"); // 加载布局 View dialogView = LayoutInflater.from(requireContext()).inflate(R.layout.dialog_create_bancai, null); Spinner spinnerCaizhi = dialogView.findViewById(R.id.spinner_caizhi); Spinner spinnerMupi1 = dialogView.findViewById(R.id.spinner_mupi1); Spinner spinnerMupi2 = dialogView.findViewById(R.id.spinner_mupi2); EditText TextInputEditTextHoudu=dialogView.findViewById(R.id.edittext_houdu); TextInputEditTextHoudu.setTextIsSelectable(true); // 绑定新建材质按钮 Button btnNewCaizhi = dialogView.findViewById(R.id.btn_new_caizhi); btnNewCaizhi.setOnClickListener(v -> { showNewOptionDialog("材质", option -> { // 避免重复添加 for (Caizhi caizhi : Data.caizhis) { if (caizhi.getName().equals(option)) return; } // 创建新材质 Caizhi newCaizhi = new Caizhi(); newCaizhi.setName(option); newCaizhi.setId(Data.caizhis.size() + 1); newCaizhi.setBancai(new ArrayList<>()); Data.caizhis.add(newCaizhi); // 刷新下拉框 Adapter.setupCaizhiSpinner(spinnerCaizhi, Data.caizhis, requireContext()); spinnerCaizhi.setSelection(Data.caizhis.size() - 1); }); }); // 绑定新建木皮按钮 Button btnNewMupi = dialogView.findViewById(R.id.btn_new_mupi); btnNewMupi.setOnClickListener(v -> { // 弹出新建木皮对话框 showNewMupiDialog(() -> { // 回调中刷新木皮下拉框 Adapter.setupMupiSpinner(spinnerMupi1, Data.mupis, requireContext()); Adapter.setupMupiSpinner(spinnerMupi2, Data.mupis, requireContext()); }); }); // 获取所有材质选项(从现有板材中提取) List<Caizhi> allCaizhi = Data.caizhis; List<Mupi> allMupi = Data.mupis; // 设置下拉框适配器 Adapter.setupCaizhiSpinner(spinnerCaizhi, allCaizhi, requireContext()); Adapter.setupMupiSpinner(spinnerMupi1, allMupi, requireContext()); Adapter.setupMupiSpinner(spinnerMupi2, allMupi, requireContext()); builder.setView(dialogView); builder.setPositiveButton("创建", (dialog, which) -> { Caizhi caizhi = (Caizhi)spinnerCaizhi.getSelectedItem() ; Mupi mupi1 = (Mupi)spinnerMupi1.getSelectedItem() ; Mupi mupi2 = (Mupi) spinnerMupi2.getSelectedItem() ; // 获取 TextInputEditText 的内容并进行校验 String houduText = TextInputEditTextHoudu.getText().toString().trim(); Double houdu = null; try { if (!houduText.isEmpty()) { // 检查输入是否为空 houdu = Double.valueOf(houduText); // 尝试将字符串转换为 Double } } catch (NumberFormatException e) { // 捕获转换异常并提示用户 Toast.makeText(getContext(), "厚度输入无效,请输入数字", Toast.LENGTH_SHORT).show(); return; } // 校验 caizhi 和 houdu 是否均有效 if (caizhi == null || houdu == null) { Toast.makeText(getContext(), "请选择材质并输入有效的厚度", Toast.LENGTH_SHORT).show(); return; } // 创建新板材 Bancai newBancai = new Bancai(); newBancai.setId(Data.bancais.size() + 1); newBancai.setCaizhi(caizhi); newBancai.setMupi1(mupi1); newBancai.setMupi2(mupi2); newBancai.setHoudu(houdu); caizhi.getBancai().add(newBancai); if (mupi1 != null) { mupi1.getBancais().add(newBancai); } if (mupi2 != null) { mupi2.getBancais().add(newBancai); } // 添加到全局列表 Data.bancais.add(newBancai); // 刷新Spinner(如果传入) if (spinnerToRefresh != null) { Adapter.setupBancaiSpinners(spinnerToRefresh, Data.bancais, getContext()); spinnerToRefresh.setSelection(Data.bancais.size() - 1); } Toast.makeText(getContext(), "板材添加成功", Toast.LENGTH_SHORT).show(); }); builder.setNegativeButton("取消", null); builder.show(); } // 显示新建选项的弹窗 /** * 显示新建选项的弹窗 * @param type 新建什么 * @param listener 反回 */ private void showNewOptionDialog(String type, OnOptionCreatedListener listener) { AlertDialog.Builder builder = new AlertDialog.Builder(requireContext()); builder.setTitle("新建" + type); final EditText input = new EditText(requireContext()); input.setHint("请输入" + type); builder.setView(input); builder.setPositiveButton("确定", (dialog, which) -> { String option = input.getText().toString().trim(); if (!option.isEmpty()) { listener.onOptionCreated(option); } }); builder.setNegativeButton("取消", null); builder.show(); } // 回调接口 interface OnOptionCreatedListener { void onOptionCreated(String option); } // 新建木皮对话框 private void showNewMupiDialog(Runnable refreshCallback) { AlertDialog.Builder builder = new AlertDialog.Builder(requireContext()); builder.setTitle("新建木皮"); View view = LayoutInflater.from(requireContext()).inflate(R.layout.dialog_new_mupi, null); EditText etName = view.findViewById(R.id.et_mupi_name); RadioGroup rgFinish = view.findViewById(R.id.rg_finish); builder.setView(view); builder.setPositiveButton("创建", (dialog, which) -> { String name = etName.getText().toString().trim(); if (name.isEmpty()) { Toast.makeText(getContext(), "请输入木皮名称", Toast.LENGTH_SHORT).show(); return; } // 避免重复添加 for (Mupi m : Data.mupis) { if (m.getName().equals(name)) return; } // 创建木皮对象 Mupi newMupi = new Mupi(); newMupi.setId(Data.mupis.size() + 1); newMupi.setName(name); newMupi.setYou(rgFinish.getCheckedRadioButtonId() == R.id.rb_painted); newMupi.setBancais(new ArrayList<>()); Data.mupis.add(newMupi); refreshCallback.run(); }); builder.setNegativeButton("取消", null); builder.show(); } }<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:padding="16dp"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="组件选择" android:textStyle="bold" android:layout_marginTop="8dp"/> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <Spinner android:id="@+id/et_zujian_name" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:padding="8dp"/> <Button android:id="@+id/btn_add_zujian" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="+" android:layout_marginLeft="8dp"/> </LinearLayout> <SearchView android:id="@+id/search_bancai" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="16dp" android:queryHint="搜索板材..." android:iconifiedByDefault="false" android:layout_marginBottom="8dp"/> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="板材选择" android:textStyle="bold" android:layout_marginTop="8dp"/> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <Spinner android:id="@+id/spinner_bancai" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:padding="8dp"/> <Button android:id="@+id/btn_add_bancai" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="+" android:layout_marginLeft="8dp"/> </LinearLayout> </LinearLayout><?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:fillViewport="true"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:padding="16dp"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="选择订单" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:weightSum="4"> <Spinner android:id="@+id/spinner_dingdan" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="3" android:prompt="@string/select_dingdan" /> <Button android:id="@+id/btn_new_dingdan" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="新建订单" /> </LinearLayout> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="选择产品" android:layout_marginTop="16dp"/> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:weightSum="4"> <Spinner android:id="@+id/spinner_chanpin" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="3" android:prompt="@string/select_chanpin" /> <Button android:id="@+id/btn_add_chanpin" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="添加产品" /> </LinearLayout> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="选择组件" android:layout_marginTop="16dp"/> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:weightSum="4"> <Spinner android:id="@+id/spinner_zujian" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="3" android:prompt="@string/select_zujian" /> <Button android:id="@+id/btn_add_zujian" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="添加组件" /> </LinearLayout> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="选择板材" android:layout_marginTop="16dp"/> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:weightSum="4"> <Spinner android:id="@+id/spinner_bancai" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="3" android:prompt="@string/select_bancai" /> </LinearLayout> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="数量" android:layout_marginTop="16dp"/> <EditText android:id="@+id/et_shuliang" android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType="number" /> <RadioGroup android:id="@+id/rg_type" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="16dp" android:orientation="horizontal"> <RadioButton android:id="@+id/rb_jinhuo" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="进货" android:checked="true"/> <RadioButton android:id="@+id/rb_xiaohao" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="消耗" /> </RadioGroup> <Button android:id="@+id/btn_submit" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="24dp" android:text="提交" /> </LinearLayout> </ScrollView>E FATAL EXCEPTION: main Process: com.example.kucun2, PID: 15672 java.lang.ClassCastException: androidx.appcompat.widget.AppCompatSpinner cannot be cast to android.widget.EditText at com.example.kucun2.ui.jinhuo.AddInventoryFragment.showCreateZujianDialog(AddInventoryFragment.java:565) at com.example.kucun2.ui.jinhuo.AddInventoryFragment.addZujianToChanpin(AddInventoryFragment.java:344) at com.example.kucun2.ui.jinhuo.AddInventoryFragment.lambda$onCreateView$2(AddInventoryFragment.java:90) at com.example.kucun2.ui.jinhuo.AddInventoryFragment.$r8$lambda$g7ZiJT_Sfp7Zl8Vt7clUdS_KcN8(Unknown Source:0) at com.example.kucun2.ui.jinhuo.AddInventoryFragment$$ExternalSyntheticLambda2.onClick(D8$$SyntheticClass:0) at android.view.View.performClick(View.java:8166) at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1218) at android.view.View.performClickInternal(View.java:8143) at android.view.View.-$$Nest$mperformClickInternal(Unknown Source:0) at android.view.View$PerformClick.run(View.java:32198)

filetype

package com.example.kucun2.ui.jinhuo; import static android.content.ContentValues.TAG; import android.app.AlertDialog; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.EditText; import android.widget.RadioGroup; import android.widget.Spinner; import android.widget.TextView; import android.widget.Toast; import androidx.annotation.NonNull; import androidx.fragment.app.Fragment; import com.example.kucun2.R; import com.example.kucun2.entity.*; import com.example.kucun2.entity.data.Data; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Random; public class AddInventoryFragment extends Fragment { private Spinner spinnerDingdan, spinnerChanpin, spinnerZujian, spinnerBancai; private EditText etShuliang; private RadioGroup rgType; private Dingdan selectedDingdan; private Chanpin selectedChanpin; private Zujian selectedZujian; private Bancai selectedBancai; // 创建新订单产品组件按钮 private Button btnNewDingdan, btnAddChanpin, btnAddZujian; /** * 初始化 * @param inflater The LayoutInflater object that can be used to inflate * any views in the fragment, * @param container If non-null, this is the parent view that the fragment's * UI should be attached to. The fragment should not add the view itself, * but this can be used to generate the LayoutParams of the view. * @param savedInstanceState If non-null, this fragment is being re-constructed * from a previous saved state as given here. * * @return */ @Override public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_add_inventory, container, false); // 初始化UI组件 spinnerDingdan = view.findViewById(R.id.spinner_dingdan); spinnerChanpin = view.findViewById(R.id.spinner_chanpin); spinnerZujian = view.findViewById(R.id.spinner_zujian); spinnerBancai = view.findViewById(R.id.spinner_bancai); etShuliang = view.findViewById(R.id.et_shuliang); rgType = view.findViewById(R.id.rg_type); Button btnSubmit = view.findViewById(R.id.btn_submit); // 初始化新按钮 btnNewDingdan = view.findViewById(R.id.btn_new_dingdan); btnAddChanpin = view.findViewById(R.id.btn_add_chanpin); btnAddZujian = view.findViewById(R.id.btn_add_zujian); // 设置按钮点击事件 btnNewDingdan.setOnClickListener(v -> createNewDingdan()); btnAddChanpin.setOnClickListener(v -> addChanpinToDingdan()); btnAddZujian.setOnClickListener(v -> addZujianToChanpin()); // 设置订单选择器 setupDingdanSpinner(); // 提交按钮点击事件 btnSubmit.setOnClickListener(v -> addInventoryRecord()); return view; } private void setupDingdanSpinner() { // 定制订单适配器显示订单号(number) ArrayAdapter<Dingdan> dingdanAdapter = new ArrayAdapter<Dingdan>( requireContext(), android.R.layout.simple_spinner_item, Data.dingdans) { @NonNull @Override public View getView(int position, View convertView, @NonNull ViewGroup parent) { TextView textView = (TextView) super.getView(position, convertView, parent); Dingdan dingdan = getItem(position); if (dingdan != null) { textView.setText(dingdan.getNumber()); } return textView; } @Override public View getDropDownView(int position, View convertView, @NonNull ViewGroup parent) { TextView textView = (TextView) super.getDropDownView(position, convertView, parent); Dingdan dingdan = getItem(position); if (dingdan != null) { textView.setText(dingdan.getNumber()); } return textView; } }; dingdanAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinnerDingdan.setAdapter(dingdanAdapter); spinnerDingdan.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { selectedDingdan = (Dingdan) parent.getItemAtPosition(position); setupChanpinSpinner(selectedDingdan); } @Override public void onNothingSelected(AdapterView<?> parent) {} }); } private void setupChanpinSpinner(Dingdan dingdan) { // 获取该订单的产品列表 List<Chanpin> chanpins = new ArrayList<>(); for (Dingdan_Chanpin dc : dingdan.getChanpins()) { chanpins.add(dc.getChanpin()); } // 定制产品适配器显示产品名(name) ArrayAdapter<Chanpin> chanpinAdapter = new ArrayAdapter<Chanpin>( requireContext(), android.R.layout.simple_spinner_item, chanpins) { @NonNull @Override public View getView(int position, View convertView, @NonNull ViewGroup parent) { Log.d(TAG, "getView:position="+position+",convertView="+convertView+",parent="+parent); TextView textView = (TextView) super.getView(position, convertView, parent);//也是 convertView=null 就不报错 Chanpin chanpin = getItem(position); if (chanpin != null) { textView.setText(chanpin.getName()); } return textView; } @Override public View getDropDownView(int position, View convertView, @NonNull ViewGroup parent) { TextView textView = (TextView) super.getDropDownView(position, convertView, parent); Chanpin chanpin = getItem(position); if (chanpin != null) { textView.setText(chanpin.getName()); } return textView; } }; chanpinAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinnerChanpin.setAdapter(chanpinAdapter); spinnerChanpin.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { selectedChanpin = (Chanpin) parent.getItemAtPosition(position); setupZujianSpinner(selectedChanpin); } @Override public void onNothingSelected(AdapterView<?> parent) {} }); } private void setupZujianSpinner(Chanpin chanpin) { // 获取该产品的组件列表 List<Zujian> zujians = new ArrayList<>(); for (Chanpin_Zujian cz : chanpin.getZujians()) { zujians.add(cz.getZujian()); } // 定制组件适配器显示组件名(name) ArrayAdapter<Zujian> zujianAdapter = new ArrayAdapter<Zujian>( requireContext(), android.R.layout.simple_spinner_item, zujians) { @NonNull @Override public View getView(int position, View convertView, @NonNull ViewGroup parent) { Log.d(TAG, "getView:position="+position+",convertView="+convertView+",parent="+parent); TextView textView = (TextView) super.getView(position, convertView, parent);//也是 convertView=null 就不报错 Zujian zujian = getItem(position); if (zujian != null) { textView.setText(zujian.getName()); } return textView; } @Override public View getDropDownView(int position, View convertView, @NonNull ViewGroup parent) { TextView textView = (TextView) super.getDropDownView(position, convertView, parent); Zujian zujian = getItem(position); if (zujian != null) { textView.setText(zujian.getName()); } return textView; } }; zujianAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinnerZujian.setAdapter(zujianAdapter); spinnerZujian.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { selectedZujian = (Zujian) parent.getItemAtPosition(position); setupBancaiSpinner(selectedChanpin, selectedZujian); } @Override public void onNothingSelected(AdapterView<?> parent) {} }); } private void setupBancaiSpinner(Chanpin chanpin, Zujian zujian) { // 获取该组件关联的板材 List<Bancai> bancais = new ArrayList<>(); for (Chanpin_Zujian cz : chanpin.getZujians()) { if (cz.getZujian().getId().equals(zujian.getId())) { bancais.add(cz.getBancai()); } } // 定制板材适配器显示TableText(保持不变) ArrayAdapter<Bancai> bancaiAdapter = new ArrayAdapter<Bancai>( requireContext(), android.R.layout.simple_spinner_item, bancais) { @NonNull @Override public View getView(int position, View convertView, @NonNull ViewGroup parent) { Log.d(TAG, "getView:position="+position+",convertView="+convertView+",parent="+parent); TextView textView = (TextView) super.getView(position, convertView, parent);// 点击添加组件才会一直报 convertView=null java.lang.NullPointerException Bancai bancai = getItem(position); if (bancai != null) { textView.setText(bancai.TableText()); } return textView; } @Override public View getDropDownView(int position, View convertView, @NonNull ViewGroup parent) { TextView textView = (TextView) super.getDropDownView(position, convertView, parent); Bancai bancai = getItem(position); if (bancai != null) { textView.setText(bancai.TableText()); } return textView; } }; bancaiAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinnerBancai.setAdapter(bancaiAdapter); spinnerBancai.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { selectedBancai = (Bancai) parent.getItemAtPosition(position); } @Override public void onNothingSelected(AdapterView<?> parent) {} }); } // ... addInventoryRecord和createRecord方法保持不变 ... private void addInventoryRecord() { // 验证必填项 if (selectedDingdan == null || selectedChanpin == null || selectedZujian == null || selectedBancai == null) { Toast.makeText(getContext(), "请选择订单、产品、组件和板材", Toast.LENGTH_SHORT).show(); return; } String shuliangStr = etShuliang.getText().toString().trim(); if (shuliangStr.isEmpty()) { Toast.makeText(getContext(), "请输入数量", Toast.LENGTH_SHORT).show(); return; } // 解析数量 int shuliang; try { shuliang = Integer.parseInt(shuliangStr); } catch (NumberFormatException e) { Toast.makeText(getContext(), "请输入有效的数量", Toast.LENGTH_SHORT).show(); return; } // 确定操作类型(进货或消耗) boolean isJinhuo = rgType.getCheckedRadioButtonId() == R.id.rb_jinhuo; // 实际开发中应从登录信息获取当前用户 User currentUser = new User(1, "当前用户", "user", "password",1); // 创建记录 createRecord(selectedDingdan, selectedChanpin, selectedZujian, selectedBancai, shuliang, isJinhuo, currentUser); Toast.makeText(getContext(), "记录添加成功", Toast.LENGTH_SHORT).show(); etShuliang.setText(""); // 清空输入框 } private void createRecord(Dingdan dingdan, Chanpin chanpin, Zujian zujian, Bancai bancai, int shuliang, boolean isJinhuo, User user) { if (isJinhuo) { // 创建进货记录 Jinhuo jinhuo = new Jinhuo(); jinhuo.setId(Data.jinhuoList.size() + 1); jinhuo.setDingdan(dingdan); jinhuo.setChanpin(chanpin); jinhuo.setZujian(zujian); jinhuo.setBancai(bancai); jinhuo.setShuliang(shuliang); jinhuo.setDate(new Date()); jinhuo.setUser(user); Data.jinhuoList.add(jinhuo); } else { // 消耗数量转为负数 shuliang = -shuliang; } // 更新库存 updateKucun(bancai, shuliang); } private void updateKucun(Bancai bancai, int changeAmount) { // 查找现有库存记录 for (Kucun k : Data.kucuns) { if (k.getBancai().getId().equals(bancai.getId())) { k.setShuliang(k.getShuliang() + changeAmount); return; } } // 如果没有找到库存记录,创建新的 Kucun newKucun = new Kucun(); newKucun.setId(Data.kucuns.size() + 1); newKucun.setBancai(bancai); newKucun.setShuliang(Math.max(changeAmount, 0)); // 确保不为负 Data.kucuns.add(newKucun); } // 新建订单方法 private void createNewDingdan() { // 创建新订单(示例:实际应弹窗或跳转页面) Dingdan newDingdan = new Dingdan(); newDingdan.setId( (Data.dingdans.size() + 1)); newDingdan.setNumber("新建订单" + System.currentTimeMillis()); newDingdan.setChanpins(new ArrayList<>()); Data.dingdans.add(newDingdan); // 刷新订单下拉框 setupDingdanSpinner(); spinnerDingdan.setSelection(Data.dingdans.size() - 1); Toast.makeText(getContext(), "新建订单成功", Toast.LENGTH_SHORT).show(); } // 为当前订单添加产品 private void addChanpinToDingdan() { if (selectedDingdan == null) { Toast.makeText(getContext(), "请先选择订单", Toast.LENGTH_SHORT).show(); return; } // 创建新产品(示例:实际应弹窗输入产品信息) Chanpin newChanpin = new Chanpin(); newChanpin.setId( (Data.chanpins.size() + 1)); newChanpin.setName("新产品" + System.currentTimeMillis()); newChanpin.setZujians(new ArrayList<>()); // 添加到全局列表 Data.chanpins.add(newChanpin); // 添加到当前订单的产品列表 Dingdan_Chanpin dc = new Dingdan_Chanpin(); dc.setId(selectedDingdan.getChanpins().size() + 1); dc.setChanpin(newChanpin); dc.setDingdan(selectedDingdan); selectedDingdan.getChanpins().add(dc); // 刷新产品下拉框 setupChanpinSpinner(selectedDingdan); spinnerChanpin.setSelection(selectedDingdan.getChanpins().size() - 1); Toast.makeText(getContext(), "产品添加成功", Toast.LENGTH_SHORT).show(); } // 为当前产品添加组件 private void addZujianToChanpin() { if (selectedChanpin == null) { Toast.makeText(getContext(), "请先选择产品", Toast.LENGTH_SHORT).show(); return; } // // 创建新组件(示例) // Zujian newZujian = new Zujian(); // newZujian.setId( (Data.zujians.size() + 1)); // newZujian.setName("新组件" + System.currentTimeMillis()); // // // 添加到全局列表 // Data.zujians.add(newZujian); // // // 添加到当前产品的组件列表 // Chanpin_Zujian cz = new Chanpin_Zujian(); // cz.setId(selectedChanpin.getZujians().size() + 1); // cz.setZujian(newZujian); // cz.setChanpin(selectedChanpin); // selectedChanpin.getZujians().add(cz); // // // 刷新组件下拉框 // setupZujianSpinner(selectedChanpin); // spinnerZujian.setSelection(selectedChanpin.getZujians().size() - 1); // // Toast.makeText(getContext(), "组件添加成功", Toast.LENGTH_SHORT).show(); showCreateZujianDialog(); } // 新建板材 private void createNewBancai() { // 创建新板材(示例) Random rand = new Random(12345); Bancai newBancai = new Bancai(); newBancai.setId((Data.bancais.size() + 1)); newBancai.setCaizhi(Data.bancais.get(rand.nextInt(Data.bancais.size()-1)).getCaizhi()); newBancai.setMupi1(Data.bancais.get(rand.nextInt(Data.bancais.size()-1)).getMupi1()); newBancai.setMupi2(Data.bancais.get(rand.nextInt(Data.bancais.size()-1)).getMupi2()); // 添加到全局列表 Data.bancais.add(newBancai); // 刷新板材下拉框 setupBancaiSpinner(selectedChanpin, selectedZujian); spinnerBancai.setSelection(Data.bancais.size() - 1); Toast.makeText(getContext(), "新建板材成功", Toast.LENGTH_SHORT).show(); } private void showCreateZujianDialog() { AlertDialog.Builder builder = new AlertDialog.Builder(requireContext()); builder.setTitle("添加新组件和板材"); // 创建自定义布局 View dialogView = LayoutInflater.from(requireContext()).inflate(R.layout.dialog_create_zujian_bancai, null); EditText etZujianName = dialogView.findViewById(R.id.et_zujian_name); Spinner spinnerCaizhi = dialogView.findViewById(R.id.spinner_caizhi); Spinner spinnerMupi1 = dialogView.findViewById(R.id.spinner_mupi1); Spinner spinnerMupi2 = dialogView.findViewById(R.id.spinner_mupi2); // 设置材质下拉框适配器(只显示名称) ArrayAdapter<Caizhi> caizhiAdapter = new ArrayAdapter<Caizhi>( requireContext(), android.R.layout.simple_spinner_item, Data.caizhis) { @NonNull @Override public View getView(int position, View convertView, @NonNull ViewGroup parent) { TextView textView = (TextView) super.getView(position, convertView, parent); Caizhi caizhi = getItem(position); if (caizhi != null) { textView.setText(caizhi.getName()); } return textView; } @Override public View getDropDownView(int position, View convertView, @NonNull ViewGroup parent) { TextView textView = (TextView) super.getDropDownView(position, convertView, parent); Caizhi caizhi = getItem(position); if (caizhi != null) { textView.setText(caizhi.getName()); } return textView; } }; caizhiAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinnerCaizhi.setAdapter(caizhiAdapter); // 设置木皮下拉框适配器(名称+油或不加) ArrayAdapter<Mupi> mupiAdapter = new ArrayAdapter<Mupi>( requireContext(), android.R.layout.simple_spinner_item, Data.mupis) { @NonNull @Override public View getView(int position, View convertView, @NonNull ViewGroup parent) { TextView textView = (TextView) super.getView(position, convertView, parent); Mupi mupi = getItem(position); if (mupi != null) { textView.setText(mupi.formatMupiDisplay()); } return textView; } @Override public View getDropDownView(int position, View convertView, @NonNull ViewGroup parent) { TextView textView = (TextView) super.getDropDownView(position, convertView, parent); Mupi mupi = getItem(position); if (mupi != null) { textView.setText(mupi.formatMupiDisplay()); } return textView; } }; mupiAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinnerMupi1.setAdapter(mupiAdapter); spinnerMupi2.setAdapter(mupiAdapter); // 添加木皮预览标签 builder.setPositiveButton("创建", (dialog, which) -> { // 获取用户输入 String zujianName = etZujianName.getText().toString().trim(); Caizhi selectedCaizhi = (Caizhi) spinnerCaizhi.getSelectedItem(); Mupi selectedMupi1 = (Mupi) spinnerMupi1.getSelectedItem(); Mupi selectedMupi2 = (Mupi) spinnerMupi2.getSelectedItem(); if (zujianName.isEmpty()) { Toast.makeText(getContext(), "请输入组件名称", Toast.LENGTH_SHORT).show(); return; } // 创建新组件 Zujian newZujian = new Zujian(); newZujian.setId(Data.zujians.size() + 1); newZujian.setName(zujianName); // 创建新板材 Bancai newBancai = new Bancai(); newBancai.setId(Data.bancais.size() + 1); newBancai.setCaizhi(selectedCaizhi); newBancai.setMupi1(selectedMupi1); newBancai.setMupi2(selectedMupi2); // 添加到全局列表 Data.zujians.add(newZujian); Data.bancais.add(newBancai); // 添加到当前产品的组件列表 Chanpin_Zujian cz = new Chanpin_Zujian(); cz.setId(selectedChanpin.getZujians().size() + 1); cz.setZujian(newZujian); cz.setBancai(newBancai); // 关联新创建的板材 cz.setChanpin(selectedChanpin); selectedChanpin.getZujians().add(cz); // 刷新组件下拉框 setupZujianSpinner(selectedChanpin); spinnerZujian.setSelection(selectedChanpin.getZujians().size() - 1); Toast.makeText(getContext(), "组件和板材添加成功", Toast.LENGTH_SHORT).show(); }); builder.setNegativeButton("取消", null); builder.show(); } }<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:padding="16dp"> <EditText android:id="@+id/et_zujian_name" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="输入组件名称"/> <EditText android:id="@+id/et_bancai_name" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="输入板材名称(可选)" android:layout_marginTop="8dp"/> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="材质选择" android:layout_marginTop="16dp"/> <Spinner android:id="@+id/spinner_caizhi" android:layout_width="match_parent" android:layout_height="wrap_content"/> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="木皮1" android:layout_marginTop="8dp"/> <Spinner android:id="@+id/spinner_mupi1" android:layout_width="match_parent" android:layout_height="wrap_content"/> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="木皮2(可选)" android:layout_marginTop="8dp"/> <Spinner android:id="@+id/spinner_mupi2" android:layout_width="match_parent" android:layout_height="wrap_content"/> </LinearLayout>添加组件和板材页面显示没有下拉框

Granger_g
  • 粉丝: 5966
上传资源 快速赚钱