Android R.java сопоставление с макетами ресурсов при добавлении проекта библиотеки - PullRequest
1 голос
/ 03 апреля 2012

Я провел некоторое исследование по моему вопросу в поведении android R.java при добавлении библиотечного проекта

Я заметил, что когда библиотечный проект добавляется в любой проект android,создано два файла R.java.

project.R.java

 public static final class layout {
    public static int capture=0x7f030000;
    public static int main=0x7f030001;
}

lib.R.java

public static final class layout {
    public static final int add=0x7f030000;
    public static final int capture=0x7f030001;
    public static final int main=0x7f030002;
}

, и проект, который был установлен как библиотека, имеетсвой собственный R.java, который выглядит как

 public static final class layout {
    public static int capture=0x7f030000;
    public static int main=0x7f030001;
}

В библиотеке примеров есть только одно действие, которое я запускаю из своего приложения, и это действие устанавливает основной макет.Теперь, если мы увидим, что id для «main» в R.java отличается в моем приложении и в проекте библиотеки.Я попытался напечатать значение id из библиотеки и его значение 0x7f030002, которое является значением в моем файле R.java приложения.

Теперь мое приложение не имеет основного макета и в библиотеке, когда я устанавливаю контент smain, оно устанавливает main.xml из проекта библиотеки !!Если я добавлю основной макет в свой проект приложения, lib установит этот main как его макет !!

Т.е. идентификатор для main берется из R.java моего приложения, и этот идентификатор отличается от идентификатора дляmain в библиотеке, но макет правильно выбран из библиотеки.

Как это происходит? Помогите

активность моего приложения:

import com.idg.test.lib.TestLibActivity;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;

public class TestProjectActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    Log.i("starting","oncraete main id "+ R.layout.main);
    super.onCreate(savedInstanceState);
    setContentView(R.layout.add);
    startActivity(new Intent(this,TestLibActivity.class));

}

}

lib деятельность:

    import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

public class TestLibActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.i("Library","Library main id" +R.layout.main );
    setContentView(R.layout.main);
}

}

1 Ответ

7 голосов
/ 04 апреля 2012

От: Сайт разработчика Android

Когда вы создаете приложение, которое зависит от проекта библиотеки, Инструменты SDK компилируют библиотеку во временный файл JAR и используют ее в основной проект, а затем использует результат для создания .apk. В случаях где идентификатор ресурса определяется как в приложении, так и в библиотека, инструменты гарантируют, что ресурс, объявленный в приложение получает приоритет и ресурс в проекте библиотеки не компилируется в приложение .apk. Это дает ваше заявление гибкость, позволяющая использовать или переопределять любое поведение ресурсов или значения, которые определены в любой библиотеке.

Надеюсь, что он отвечает на ваш вопрос

...