![](/img/trans.png)
[英]How can i make use of views defined in layout XML file as template to create views programmatic way
[英]How can I make the Views defined in Android XML customs view file visible
我有以下代码,它具有一个元素,如其下面的XML文件所示,并调用了名为card
的custom view
package tk.zillion.app1;
import tk.zillion.app1.CustomViews.Card;
public class EmptyActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_empty);
RelativeLayout rl;
rl = (RelativeLayout) findViewById(R.id.activity_empty);
rl.addView(new Card(this));
}
}
以下是XML文件,以及布局在Android Studio中的显示方式:
Card
自定义视图如下代码和XML文件:
package tk.zillion.app1.CustomViews;
import tk.zillion.app1.R;
public class Card extends RelativeLayout {
public Card(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context);
}
public Card(Context context, AttributeSet attrs){
super(context, attrs);
init(context);
}
public Card(Context context) {
super(context);
init(context);
}
private void init(Context context) {
WindowManager windowmanager = (WindowManager) this.getContext()
.getSystemService(Context.WINDOW_SERVICE);
Display display = windowmanager.getDefaultDisplay();
Point size = new Point();
display.getSize(size);
int width = size.x;
int height = size.y;
RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT);;
RelativeLayout rl = new RelativeLayout(this.getContext());
rl.setBackground(context.getDrawable(R.drawable.layer_card_background));
rl.setMinimumWidth(width);
Button btn = new Button(this.getContext());
// btn.setId(R.id.titleId);
btn.setId(View.generateViewId());
TextView one = new TextView(this.getContext());
one.setText("Device width is: "+String.valueOf(width)+", Device height is: "+String.valueOf(height));
one.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);
btn.setText(R.string.custom);
btn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
int duration = Toast.LENGTH_SHORT;
CharSequence text = "Hello from another toast!";
Toast toast = Toast.makeText(v.getContext(), text, duration);
toast.show();
}
});
rl.addView(btn);
lp.addRule(RelativeLayout.BELOW, btn.getId());
rl.addView(one, lp);
// or one.setLayoutParams(lp); rl.addView(one);
// lp.removeRule(RelativeLayout.BELOW);
this.addView(rl);
}
}
XML文件是:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/custom_view"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
>
<tk.zillion.app1.CustomViews.Card
android:id="@+id/custom_card"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/app_name"
/>
</tk.zillion.app1.CustomViews.Card>
</RelativeLayout>
并在Android Studio中显示为:
下面是该应用在执行时的外观(右侧)以及应如何(左侧)。 XML文件中定义的View(即“ My First App
TextView)不会在执行时显示,而所有其他实用地定义的元素都是可见的。
我尝试使用inflate
但无法与我一起使用
我的问题是,如何查看XML文件中定义的视图?
试试这个xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/custom_view"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
>
<TextView android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/app_name"
/>
<tk.zillion.app1.CustomViews.Card
android:id="@+id/custom_card"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
我找到了答案,并将在下面进行详细说明,将来可能有人会从中获得帮助:
1。 无需使用<tk.zillion.app1.CustomViews.Card>
因此我将view_customs.xml
重组为:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/custom_view"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
>
<TextView android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/app_name"
/>
</LinearLayout>
2。 看来我错误地使用了充气机,因此请重新使用它以匹配:
inflate(XmlPullParser parser, ViewGroup root, boolean attachToRoot)
膨胀语句,其中它从指定的XML节点膨胀新的视图层次结构。
3。 我的Card
类init
方法的最终结构为:
private void init(Context context) {
// 1. Define the main layout of the CARD class
RelativeLayout cardLayout = new RelativeLayout(this.getContext());
// 2. (Optional) set the require specs for this Layout
cardLayout.setBackground(
context.getDrawable(R.drawable.layer_card_background));
cardLayout.setMinimumWidth(width);
// 3. Inflate the custom view
LayoutInflater inflater = LayoutInflater.from(context);
View inflatedLayout= inflater.inflate(R.layout.view_customs, null, false);
// 4. Set ID for the inflated view
inflatedLayout.setId(View.generateViewId());
// 5. (Optional) pick and change the elements in the custom view
TextView otv = (TextView) inflatedLayout.findViewById(R.id.tv);
otv.setText("Welcome to my first app");
/*
You can avoid point 3, 4 and 5, if you do not want to infalte from existing layout, simply use:
View inflatedLayout = new View(this.getContext());
*/
// 6. (Optional) create new elements
Button btn = new Button(this.getContext());
btn.setId(View.generateViewId());
btn.setText(R.string.custom);
btn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
int duration = Toast.LENGTH_SHORT;
CharSequence text = "Hello from another toast!";
Toast toast = Toast.makeText(v.getContext(), text, duration);
toast.show();
}
});
TextView one = new TextView(this.getContext());
one.setText("Device width is: ");
one.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);
// 7. Locate the relative locations between the inflated element and the main Layout
RelativeLayout.LayoutParams p = new RelativeLayout.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
p.addRule(RelativeLayout.BELOW, inflatedLayout.getId());
cardLayout.setLayoutParams(p);
// 8. In the same way as of 7, locate the relative locations of the elements inside the main Layout itself.
RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
lp.addRule(RelativeLayout.BELOW, btn.getId());
// 9. Add the inflated Layout, and all other elements to the main Layout
cardLayout.addView(inflatedLayout);
cardLayout.addView(btn);
cardLayout.addView(one, lp);
// 10. Add the main Layout to the class
this.addView(cardLayout);
// 11. In the same way, you need to locate the returned CARD
// in relative location in the view that calling it
RelativeLayout.LayoutParams p1 = new RelativeLayout.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
// ViewGroup.LayoutParams.WRAP_CONTENT
150);
p1.addRule(RelativeLayout.BELOW, R.id.checkBox);
this.setLayoutParams(p1);
}
(可选)对于自定义卡片可绘制背景,我使用了以下代码:
<?xml version="1.0" encoding="UTF-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <stroke android:width="2dp" android:color="#FFFFFFFF" /> <solid android:color="#FFFFFFFF" /> <corners android:bottomRightRadius="7dp" android:bottomLeftRadius="7dp" android:topLeftRadius="7dp" android:topRightRadius="7dp" /> </shape>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.