如何使用客户值xml(java)创建新布局?

时间:2016-11-27 15:53:59

标签: java android xml

我正在尝试制作新的布局,自定义图片R.id.imageStep1。我在layout.addView(guideLayout)收到错误。

这是我的java类:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.guide_base);

    ViewGroup layout = (ViewGroup) findViewById(R.id.guide_base);
    ViewGroup guideLayout = (ViewGroup) findViewById(R.id.guide_layout);

    Intent intent = getIntent();

    ImageView image;
    image = (ImageView) findViewById(R.id.guideImage1);

    String guideImage = intent.getStringExtra("guideImage");
    int resId = guideLayout.getResources().getIdentifier(guideImage, "drawable", null);
    image.setImageResource(resId);

    layout.addView(guideLayout);

    String guideTitle = intent.getStringExtra("guideTitle");
    String guideText = intent.getStringExtra("guideText");
}

为什么guideLayout如果我启动时为空

guideLayout = (ViewGroup) findViewById(R.id.guide_layout);

这是添加自定义值的新xml文件的正确方法吗?

guide_base.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/guide_base">

</LinearLayout>

guide_layout.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/guide_layout">

    <ImageView
        android:layout_width="32dp"
        android:layout_height="32dp"
        app:srcCompat="@drawable/one_black_36dp"
        android:layout_marginLeft="8dp"
        android:id="@+id/imageStep1"
        android:contentDescription="Steps to follow"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_marginTop="6dp" />

    <TextView
        android:text="TextView:"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/titleStep1"
        android:textColor="@color/colorGreenPrimary"
        android:layout_marginBottom="2dp"
        android:layout_marginLeft="4dp"
        android:textSize="20sp"
        android:layout_alignBottom="@+id/imageStep1"
        android:layout_toRightOf="@+id/imageStep1"
        android:layout_toEndOf="@+id/imageStep1"
        android:textStyle="bold"/>

    <TextView
        android:id="@+id/textGuide1"
        android:contentDescription="Guide Step 1"
        android:layout_alignLeft="@+id/titleStep1"
        android:layout_alignStart="@+id/titleStep1"
        android:layout_below="@id/titleStep1"
        android:layout_height="wrap_content"
        android:textColor="@color/colorGreenSecondary"
        android:textSize="16sp"
        android:layout_width="330dp"
        android:text="Si una persona está despierta pero menos alerta de lo usual, hágale una serie de preguntas sencillas, como:  ¿Cuál es su nombre? ¿Qué día es? ¿Cuántos años tiene?" />

    <ImageView
        app:srcCompat="@drawable/persona_desmayada"
        android:id="@+id/guideImage1"
        android:scaleType="centerCrop"
        android:contentDescription="zzz"
        android:layout_height="125dp"
        android:layout_width="145dp"
        android:layout_marginTop="25dp"
        android:layout_below="@+id/textGuide1"
        android:layout_centerInParent="true" />


</RelativeLayout>

logcat的:

java.lang.RuntimeException:无法启动活动ComponentInfo {com.alertavecino.alertavecino / com.alertavecino.alertavecino.guide}:java.lang.NullPointerException:尝试调用虚方法'android.view.ViewGroup $ LayoutParams对空对象引用的android.view.View.getLayoutParams()'

2 个答案:

答案 0 :(得分:0)

尝试使用LayoutInflater调用其他视图。

private View view = null ;
Button addbutton = null;
ViewGroup parent = null;
LayoutInflater inflater = null;
inflater= (LayoutInflater)this.getSystemService(LAYOUT_INFLATER_SERVICE);
addbutton = (Button)findViewById(R.id.btnAdd);
parent = (ViewGroup) findViewById(R.id.mainxml);


addbutton.setOnClickListener(new View.OnClickListener() {
  @Override
  public void onClick(View view) {
    view = inflater.inflate(R.layout.other, null);
    parent.addView(view);
 }
});

试试这个。希望这会有所帮助:)

答案 1 :(得分:0)

在setContentView(R.layout.guide_base)中;您正在声明活动的布局。在您的布局中,您只有guide_base,在这种情况下

    ViewGroup guideLayout = (ViewGroup) findViewById(R.id.guide_layout);

将返回null,因为它不存在于guide_base布局中。 为什么不在guide_base中包含guide_layout布局?

如果您想在其他方面重复使用它。您可以将guide_base编辑为:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/guide_base">
        <include layout="@layout/guide_layout"
          android:id="@+id/guide_layout"/>
</LinearLayout>

如:https://developer.android.com/training/improving-layouts/reusing-layouts.html

中所述

或使用充气机创建guide_layout视图。见How to inflate one view with a layout