首先,我为这个糟糕的标题感到抱歉。我不知道该怎么表达我的问题,所以我要把事情弄清楚。
我正在尝试为我以前玩过的一款视频游戏制作一个android应用程序。游戏中的角色有多个插槽来装备他们库存中的物品,每个插槽都有许多可用的物品。我正在尝试做一个应用程序,你可以混合和匹配多个项目,并看到你的统计数据。每个项目槽都有一个imageview,当您单击一个项目时,它会显示一个对话框片段,列出该槽可能的项目。你只能使用一种类型的项目在每个插槽-基本上你不能把 Boot 在你的 Helm 槽-。为了确保viewmodel类只从sqlite数据库中获取正确类型的项,我在其构造函数中添加了一个“item type”参数:
public class EquipmentSelectViewModel extends AndroidViewModel {
private EquipmentRepository equipmentRepository;
private EquipmentType type;
public EquipmentSelectViewModel(@NonNull Application application, EquipmentType type) {
super(application);
equipmentRepository = new EquipmentRepository(application);
this.type = type;
}
public LiveData<List<Equipment>> getEquipments() {
return equipmentRepository.getEquipments(type);
}
为了传递所需的项类型,我在dialogfragment的newinstance()方法中添加了一个int参数:
public static EquipmentSelectDialog newInstance(int equipmentType) {
EquipmentSelectDialog fragment = new EquipmentSelectDialog();
Bundle args = new Bundle();
args.putInt(EQUIPMENT_TYPE, equipmentType);
fragment.setArguments(args);
return fragment;
}
下面是我用来显示这个片段的方法,imageviews的onclick()方法调用这个方法。
private void showSelectDialog(int equipmentType) {
FragmentManager fm = getFragmentManager();
EquipmentSelectDialog fragment = EquipmentSelectDialog.newInstance(equipmentType);
fragment.show(fm, "EquipmentSelectionDialog");
}
希望这能解决我的问题。最初,我使用if else语句根据imageview的id设置参数:
@Override
public void onClick(View v) {
if (v instanceof ImageView) {
if (v.getId() == R.id.imageView_amulet)
showSelectDialog(EquipmentSelectDialog.AMULET);
else if (v.getId() == R.id.imageView_ring1 || v.getId() == R.id.imageView_ring2)
showSelectDialog(EquipmentSelectDialog.RING);
}
}
这个方法工作得很好,但是有14个imageview,所以它很长,而且可能会让人困惑。在谷歌搜索之后,我想出了以下方法。首先,我创建一个资源文件,其中包含每个项目槽的专用整数:
<integer name="headSlotCode">1</integer>
<integer name="cloakSlotCode">2</integer>
我向每个imageview添加了一个标记,在layout的xml文件中使用正确的整数作为值:
<tag android:id="@id/equipmentTypeCode" android:value="@integer/cloakSlotCode" />
然后使用以下方法调出具有正确项类型的dialogfragment:
@Override
public void onClick(View v) {
int code = Integer.parseInt((String) v.getTag(R.id.equipmentTypeCode));
showSelectDialog(code);
}
所以我想我的问题是哪个onclick()方法更可取?起初我喜欢第二个,因为它让我觉得更聪明、更优雅,但后来我犹豫了。这有点混乱,太多的资源/类被捆绑在一起,在将来进行更改可能很困难(或者至少我这么认为?)。你认为这种方法可以接受吗?还是我想的太多了?很抱歉为一个简单的问题作了这么长的解释。
暂无答案!
目前还没有任何答案,快来回答吧!