TL; DR:为什么没有
File rewardFile = new File("res/layout/reward_cards.xml");
在Android Studio中工作?
我在Android Studio中引用res / layout文件时无法获取DocumentBuilder Document实例来解析它。
我尝试做的是在RelativeLayout对象的底部生成可变数量的CardView对象。
我当前的设置包括从单独的布局文件中扩展CardView对象,并将其添加到现有的RelativeLayout视图中。然后,修改CardView XML以表示要添加的下一个CardView,并从布局文件中重新膨胀。
private void generateRewards(Context context, RelativeLayout mainRL) {
LayoutInflater inflater = LayoutInflater.from(context);
View rewardLayout = inflater.inflate(R.layout.reward_cards, null, false);
RelativeLayout.LayoutParams rParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
rParams.addRule(RelativeLayout.BELOW, mainRL.findViewById(R.id.cardFutureGoals).getId()); //This is the current bottom view
mainRL.addView(rewardLayout, rParams);
//Now to edit the XML
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = null;
try {
docBuilder = docFactory.newDocumentBuilder();
} catch (ParserConfigurationException e) {
e.printStackTrace();
}
File rewardFile = new File("res/layout/reward_cards.xml");
Document rewardDoc = null;
if(rewardFile.exists()) { //This Fails
try {
rewardDoc = docBuilder.parse(rewardFile);
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
//Just changing the CardView's id for now
Node rootCard = null;
rootCard = rewardDoc.getFirstChild();
NamedNodeMap attr = rootCard.getAttributes();
Node rewardId = attr.getNamedItem("id");
rewardId.setTextContent("@+id/reward2");
Transformer t = null;
try {
t = TransformerFactory.newInstance().newTransformer();
} catch (TransformerConfigurationException e) {
e.printStackTrace();
}
DOMSource domSource = new DOMSource(rewardDoc);
StreamResult s = new StreamResult("res/layout/reward_cards.xml"); //This will probably also fail
try {
t.transform(domSource, s);
} catch (TransformerException e) {
e.printStackTrace();
}
...
//Inflate again and add the next cardview
rewardLayout = inflater.inflate(R.layout.reward_cards, null, false);
rParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
rParams.addRule(RelativeLayout.BELOW, mainRL.findViewById(R.id.reward1).getId());
mainRL.addView(rewardLayout, rParams);
}
这是我的reward_cards.xml:
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView
xmlns:card_view="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/reward1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="0.30"
android:background="#00CF98"
android:layout_marginLeft="4dp"
android:layout_marginRight="4dp"
android:layout_marginBottom="5dp"
android:layout_marginTop="5dp">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="100dp"
android:layout_alignParentLeft="true"
android:background="#ffffff">
...
</RelativeLayout>
</android.support.v7.widget.CardView>
因此,添加下一个CardView最终会被放入循环中,但我只想尝试获取
File rewardFile = new File("res/layout/reward_cards.xml");
此时工作。
如何在此处引用reward_cards布局文件?
有没有更简单的方法来完成我想要做的事情?
这种方法会起作用吗?
由于
答案 0 :(得分:0)
TL; DR:为什么没有
File rewardFile = new File("res/layout/reward_cards.xml");
在Android Studio中工作?
因为资源只是您的开发计算机上的文件。它不是设备上的文件。
然后,修改CardView XML以表示要添加的下一个CardView,并从布局文件中重新充气。
您无法在运行时修改资源。
这种方法会起作用吗?
没有
有没有更简单的方法来完成我想要做的事情?
步骤1:夸大布局。
步骤2:调用CardView
及其内容的方法,根据需要更改它。
步骤3:将修改后的CardView
添加到RelativeLayout
。
步骤#4:泡沫,冲洗,重复。
如果您要拥有许多此类CardView
容器,请考虑使用RecyclerView
或ListView
而不是RelativeLayout
。