Niesprawności dotyczące wyboru zasobów i wartości systemu Android

Problem, który napotykam, wskazuje, że wiadro zasobów jest wybrane dla danej aktywnościlayout XML jest niespójny z zasobami wybranymi zvalues folder pomimo dokładnie tych samych kwalifikatorów zasobów, które są używane w każdym zestawie folderów.

Przykład

Po umieszczeniu jakiegoś kodu rejestracyjnego w abstrakcyjnej aktywności nadrzędnej mojej aplikacji widzę, że podczas uruchamiania mojej aplikacji przez emulator typu Nexus 7 (Android 4.1) najmniejsza szerokość wynosi rzeczywiście 600dp,layout-sw600dp-* Folder jest używany do pobierania interfejsu użytkownika dla działania, ale folder używany przezvalues jestvalues-large-*. Spodziewałem się, że tak będzievalues-sw600dp-* dostarczając w ten sposób istotnych informacji o tym, w jakim wiaderku zasobów działa działanie.

Kod wykonujący rejestrowanie w ramach aktywności nadrzędnej mojej aplikacji dla wszystkichandroid.app.Activitys

  protected void onCreate(final Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    final Configuration config = getResources().getConfiguration();
    Log.i(this.getClass().getSimpleName(), String.format("Smallest width is [%s]", config.smallestScreenWidthDp));
    configurationContext = SupportedDeviceConfiguration.fromResourceQualifer(getString(string.resourceQualifier));
    Log.i(this.getClass().getSimpleName(), String.format("Running under the [%s] configuration context.", configurationContext.getResourceQualifier()));
...

Rejestrowanie danych wyjściowych po uruchomieniu tego kodu na urządzeniu typu Nexus 7;

[Logging fluff] Smallest width is [600]
[Logging fluff] Running under the [layout-large-land] configuration context.

Wiem, o czym myślisz - gdzie to zrobiłeśukład-duży-ląd pochodzenie pochodzi? Czytaj...

tło

Sprawdzam przedstawione podejścietutaj co pozwoliłoby mi sprawdzić wiadro zasobów używane w czasie wykonywania. Zasadniczo zastosowane przeze mnie podejście ma następującą strukturę kwalifikatorów zasobów;

- res
  + layout                   // Default portrait layout.
  + layout-land              // Default landscape layout
  + layout-large-land        // pre 3.2 phablet landscape layout (Galaxy Note at v2.3.3)
  + layout-xlarge-land       // pre 3.2 tablet landscape layout
  + layout-xlarge-port       // pre 3.2 tablet portrait layout
  + layout-sw520dp-port      // post 3.1 phablet portrait layout (Galaxy Note at v4.0.3)
  + layout-sw520dp-land      // post 3.1 phablet landscape layout
  + layout-sw600dp-port      // post 3.1 mini-tablet portrait layout (Nexus 7)
  + layout-sw600dp-land      // post 3.1 mini-tablet-landscape layout 
  + layout-sw700dp-port      // post 3.1 tablet portrait layout
  + layout-sw700dp-land      // post 3.1 tablet landscape layout
  - values                   // Contains the root strings.xml
     strings.xml
  - values-land
     default-config.xml            
  - values-large-land
     default-config.xml        
  - values-xlarge-land
     default-config.xml     
  - values-xlarge-port
     default-config.xml     
  - values-sw520dp-port
     default-config.xml     
  - values-sw520dp-land
     default-config.xml     
  - values-sw600dp-port
     default-config.xml     
  - values-sw600dp-land
     default-config.xml     
  - values-sw700dp-port
     default-config.xml     
  - values-sw700dp-land
     default-config.xml

Więc zasadniczovalues kwalifikatory odzwierciedlają kwalifikatorylayout kwalifikatorzy. Pod każdymvalues-* foldery Zdefiniowałem pojedynczy plik XML o nazwiedevice-config.xml z treścią;

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="resourceQualifier">layout-{qualifier of values folder}</string>
</resources>

Na przykładvalues-sw600dp-land lornetka składanadevice-config.xml zawiera pojedynczy łańcuch o wartościlayout-sw600dp-land. Celem jest, aby mój kod pozostał zsynchronizowany z układami zasobów wyświetlanymi na ekranie. Jest to potrzebne, aby mój kod nie działał „znajdując po identyfikatorze” jakiś przedmiot, który nie istnieje w wyświetlanym układzie z powodu zaangażowanej nieruchomości.

(Opcjonalnie) Głębsze rozumowanie, dlaczego to robię

Głębsze uzasadnienie chęci poznania wykorzystywanego wiadra w czasie wykonywania zrodziło się z uświadomienia sobie, że mój pojedynczy kod dla wszystkich konfiguracji był trudny w zarządzaniu za pomocą różnych logik opartych na przełącznikach, które nie były przejrzyste i często były zduplikowane. inne układy ... to było tak, jakbym potrzebował czegoś w rodzajuDziedziczenie fragmentów ... które, jeśli podążysz za linkiem, jest dokładnie tym, co zrobiłem. Wadą tego jest to, że muszę wiedzieć, z którym ekranem pracuję, zanim poinstruuję framework do tworzenia instancji fragmentów x, y lub z, wiedząc, że tworzony Fragment nigdy nie będzie zsynchronizowany z układem ma się pompować. To dziedziczenie działa i pozwala na dużo łatwiejszy do zarządzania stos fragmentów (Sonar jest również bardziej szczęśliwy, co jest miłe).

streszczenie

Udaremniono mi jednak tę pozorną rozbieżność między tym, który folder układu i folder wartości wybiera. Każdy z nich ma te same kwalifikatory, więc dlaczego działanie nie wykorzystujelayout-sw600dp-land XML interfejsu użytkownika używavalues-sw600dp-land ratunek? Mam nadzieję, że mam coś złego, ponieważ był to najpiękniejszy z potencjalnych rozwiązań opublikowanych w dyskusji SO, którą dołączyłem powyżej.

questionAnswers(2)

yourAnswerToTheQuestion