Пример Android "Уловки макета: объединение макетов" не работает - PullRequest
4 голосов
/ 28 июня 2011

Просто ищу помощи. Пожалуйста, дайте мне знать, если это слишком расплывчато.

Я пытаюсь найти пример "Объединение макетов": http://developer.android.com/resources/articles/layout-tricks-merge.html

и я не могу заставить его работать. Источник загрузки на странице не включает в себя все необходимые файлы. Я вставляю код ниже с закомментированными блоками. Когда они не комментируются, я получаю массу ошибок. Если у кого-то есть предложение до того, как я начну вставлять ошибки, это было бы здорово ...

OkCancelBar:

package com.example.android.merge;

import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.widget.Button;
import android.widget.LinearLayout;

public class OkCancelBar extends LinearLayout {
    public OkCancelBar(Context context, AttributeSet attrs) {
        super(context, attrs);
        setOrientation(HORIZONTAL);
        setGravity(Gravity.CENTER);
        setWeightSum(1.0f);

        LayoutInflater.from(context).inflate(R.layout.okcancelbar, this, true);
        /*
        TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.OkCancelBar, 0, 0);

        String text = array.getString(R.styleable.OkCancelBar_okLabel);
        if (text == null) text = "Ok";
        ((Button) findViewById(R.id.okcancelbar_ok)).setText(text);

        text = array.getString(R.styleable.OkCancelBar_cancelLabel);
        if (text == null) text = "Cancel";
        ((Button) findViewById(R.id.okcancelbar_cancel)).setText(text);

        array.recycle(); 
        */

    }
}

main.xml:

<?xml version="1.0" encoding="utf-8"?>

<merge
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:okCancelBar="http://schemas.android.com/apk/res/com.example.android.merge">

    <ImageView  
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent" 

        android:scaleType="center"
        android:src="@drawable/golden_gate" />

    <com.example.android.merge.OkCancelBar
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:layout_gravity="bottom"

        android:paddingTop="8dip"
        android:gravity="center_horizontal"

        android:background="#AA000000"
        <!--
        okCancelBar:okLabel="Save"
        okCancelBar:cancelLabel="Don't save" 
        -->
        />

</merge>

Ответы [ 3 ]

4 голосов
/ 28 июня 2011

Я посмотрел в заархивированных источниках и нет файла res / values ​​/ attrs.xml. Это странно.
Создайте файл attrs.xml и поместите код, указанный ниже:

<resources>
     <declare-styleable name="OkCancelBar">
        <attr name="okLabel" format="string" />
        <attr name="cancelLabel" format="string" />
    </declare-styleable>
</resources>

Это должно работать сейчас, но у меня нет времени, чтобы проверить это, извините.

2 голосов
/ 03 декабря 2011

В этом примере отсутствует пара файлов.А именно:

В папке макета: он должен иметь main.xml, okcancelbar.xml и okcancelbar_button.xml.Под папкой значений: он должен иметь attrs.xml

Содержимое для main.xml и okcancelbar.xml было предоставлено в примере статьи.Файл okcancelbar_button.xml должен определить одну кнопку следующим образом:

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

И attrs.xml должен предоставить определение метки:

<resources>
     <declare-styleable name="OkCancelBar">
        <attr name="okLabel" format="string" />
        <attr name="cancelLabel" format="string" />
    </declare-styleable>
</resources>

Тогда все должно собраться вместе.

1 голос
/ 23 мая 2013

Ответ pawelzieba & X-Ray является правильным, также посмотрите на эту модификацию.Поместите следующий код в okcancelbar.xml

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

    <Button
        android:id="@+id/okcancelbar_ok"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >
    </Button>

    <Button
        android:id="@+id/okcancelbar_cancel"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >
    </Button>

</LinearLayout>

И измените OkCancelBar.java согласно следующему для лучшего понимания

public class OkCancelBar extends LinearLayout 
{
    Context mContext;

    public OkCancelBar(Context context, AttributeSet attrs) 
    {
        super(context, attrs);
        setOrientation(HORIZONTAL);
        setGravity(Gravity.CENTER);
        setWeightSum(1.0f);

        mContext = context;

        LayoutInflater.from(context).inflate(R.layout.okcancelbar, this, true);

        TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.OkCancelBar, 0, 0);

        String text = array.getString(R.styleable.OkCancelBar_okLabel);
        if (text == null) text = "Ok";
        //((Button) findViewById(R.id.button)).setText(text);
        ((Button) findViewById(R.id.okcancelbar_ok)).setText(text);

        text = array.getString(R.styleable.OkCancelBar_cancelLabel);
        if (text == null) text = "Cancel";
        //((Button) findViewById(R.id.button)).setText(text);
        ((Button) findViewById(R.id.okcancelbar_cancel)).setText(text);

        Button btnCancel = (Button) findViewById(R.id.okcancelbar_cancel);
        btnCancel.setOnClickListener(new View.OnClickListener() 
        {
            @Override
            public void onClick(View v) 
            {
                Toast.makeText(mContext, "Cancel is Clicked...", Toast.LENGTH_LONG).show();
            }
        });

        Button btnOk = (Button) findViewById(R.id.okcancelbar_ok);
        btnOk.setOnClickListener(new View.OnClickListener() 
        {
            @Override
            public void onClick(View v) 
            {
                Toast.makeText(mContext, "OK is pressed...", Toast.LENGTH_LONG).show();
            }
        });

        array.recycle();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...