Android
Resurser
Sök…
Översätt en sträng
Strängar kan internationaliseras genom att definiera en annan strängar.xml för varje språk du stöder.
Du lägger till ett nytt språk genom att skapa en ny värdekatalog med ISO-språkkoden som ett suffix. När du till exempel lägger till en tysk uppsättning kan din struktur se ut så här:
När systemet letar efter den begärda strängen kontrollerar den först den språkspecifika xml, om den inte hittas returneras värdet från standardsträngarna.xml-filen. Nyckeln förblir densamma för varje språk och bara värdet ändras.
Exempel på innehåll:
/res/values/strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">HelloWorld</string>
<string name="hello_world">Hello World!</string>
</resources>
/res/values-fr/strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello_world">Bonjour tout le monde !!!</string>
</resources>
Definiera strängar
Strängar lagras vanligtvis i strings.xml
. De definieras med ett <string>
XML-element.
Syftet med strängar.xml är att tillåta internationalisering. Du kan definiera en strings.xml för varje iso-kod för språk. Således när systemet letar efter strängen 'app_name' kontrollerar den först xml-filen som motsvarar det aktuella språket, och om den inte hittas, letar du efter posten i standardsträngarna.xml-filen. Detta betyder att du bara kan välja att lokalisera några av dina strängar medan inte andra.
/res/values/strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Hello World App</string>
<string name="hello_world">Hello World!</string>
</resources>
När en sträng har definierats i en XML-resursfil kan den användas av andra delar av appen.
En apps XML-projektfiler kan använda ett <string>
-element genom att hänvisa till @string/string_name
. Till exempel innehåller en apps manifest (/manifests/AndroidManifest.xml) -filen följande rad som standard i Android Studio:
android:label="@string/app_name"
Detta berättar för Android att leta efter en <string>
-resurs som heter "app_name" för att använda som namn för appen när den installeras eller visas i en start.
En annan gång du skulle använda en <string>
-resurs från en XML-fil i Android skulle vara i en layoutfil. Till exempel representerar följande en TextView som visar hello_world
strängen som vi definierade tidigare:
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world"/>
Du kan också få tillgång till <string>
-resurser från java-delen av din app. För att återkalla samma hello_world
sträng ovanifrån i en aktivitetsklass, använd:
String helloWorld = getString(R.string.hello_world);
Definiera strängarray
För att definiera en stränguppsättning skriv i en resursfil
res / värden / filename.xml
<string-array name="string_array_name">
<item>text_string</item>
<item>@string/string_id</item>
</string-array>
till exempel
res / värden / arrays.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="string_array_example">
<item>@string/app_name</item>
<item>@string/hello_world</item>
</string-array>
</resources>
och använd den från java som
String[] strings = getResources().getStringArray(R.array.string_array_example;
Log.i("TAG",Arrays.toString(strings)));
Produktion
I/TAG: [HelloWorld, Hello World!]
Definiera dimensioner
Dimensioner lagras vanligtvis i en dimens.xml
. De definieras med ett <dimen>
-element.
res / värden / dimens.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="small_padding">5dp</dimen>
<dimen name="medium_padding">10dp</dimen>
<dimen name="large_padding">20dp</dimen>
<dimen name="small_font">14sp</dimen>
<dimen name="medium_font">16sp</dimen>
<dimen name="large_font">20sp</dimen>
</resources>
Du kan använda olika enheter:
- sp: Skalaoberoende pixlar. För teckensnitt.
- dp: Densitetsoberoende pixlar. För allt annat.
- pt: Poäng
- px: Pixlar
- mm: Millimeter
- im: Inches
Dimensioner kan nu refereras i XML med syntaxen @dimen/name_of_the_dimension
.
Till exempel:
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="@dimen/large_padding">
</RelativeLayout>
Definiera heltal
Heltal lagras vanligtvis i en resursfil med namnet integers.xml
, men filnamnet kan väljas godtyckligt. Varje heltal definieras med hjälp av ett <integer>
-element, som visas i följande fil:
res / värden / integers.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<integer name="max">100</integer>
</resources>
Heltal kan nu refereras i XML med syntaxen @integer/name_of_the_integer
, som visas i följande exempel:
<ProgressBar
android:layout_width="match_parent"
android:layout_height="match_parent"
android:max="@integer/max"/>
Definiera heltalskal
För att definiera ett heltal array skriv i en resursfil
res / värden / filename.xml
<integer-array name="integer_array_name">
<item>integer_value</item>
<item>@integer/integer_id</item>
</integer-array>
till exempel
res / värden / arrays.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<integer-array name="fibo">
<item>@integer/zero</item>
<item>@integer/one</item>
<item>@integer/one</item>
<item>@integer/two</item>
<item>@integer/three</item>
<item>@integer/five</item>
</integer-array>
</resources>
och använd den från java som
int[] values = getResources().getIntArray(R.array.fibo);
Log.i("TAG",Arrays.toString(values)));
Produktion
I/TAG: [0, 1, 1, 2, 3, 5]
Definiera färger
Färger lagras vanligtvis i en colors.xml
namnet colors.xml
i colors.xml
/res/values/
.
De definieras av <color>
-element:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="colorPrimary">#3F51B5</color>
<color name="colorPrimaryDark">#303F9F</color>
<color name="colorAccent">#FF4081</color>
<color name="blackOverlay">#66000000</color>
</resources>
Färger representeras av hexadecimala färgvärden för varje färgkanal (0 - FF)
i ett av formaten:
-
#RGB
-
#ARGB
-
#RRGGBB
-
#AARRGGBB
Legend
- A - alfakanal - 0-värdet är helt transparent, FF-värdet är ogenomskinligt
- R - röd kanal
- G - grön kanal
- B - blå kanal
Definierade färger kan användas i XML med följande syntax @color/name_of_the_color
Till exempel:
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/blackOverlay">
Använda färger i kod
Dessa exempel antar att this
är en aktivitetsreferens. En sammanhangsreferens kan också användas på sin plats.
int color = ContextCompat.getColor(this, R.color.black_overlay);
view.setBackgroundColor(color);
int color = this.getResources().getColor(this, R.color.black_overlay);
view.setBackgroundColor(color);
I deklarationen colorPrimary
används colorPrimary
, colorPrimaryDark
och colorAccent
för att definiera Materialdesignfärger som kommer att användas för att definiera anpassat Android-tema i styles.xml
. De läggs automatiskt till när nytt projekt skapas med Android Studio.
Få resurser utan "avskrivna" varningar
Med Android API 23 eller högre kan en sådan situation ofta ses:
Denna situation orsakas av den strukturella förändringen av Android API när det gäller att få resurser.
Nu funktionen:
public int getColor(@ColorRes int id, @Nullable Theme theme) throws NotFoundException
borde användas. Men android.support.v4
biblioteket har en annan lösning.
Lägg till följande beroende i filen build.gradle
:
com.android.support:support-v4:24.0.0
Då är alla metoder från supportbibliotek tillgängliga:
ContextCompat.getColor(context, R.color.colorPrimaryDark);
ContextCompat.getDrawable(context, R.drawable.btn_check);
ContextCompat.getColorStateList(context, R.color.colorPrimary);
DrawableCompat.setTint(drawable);
ContextCompat.getColor(context,R.color.colorPrimaryDark));
Dessutom kan fler metoder från supportbiblioteket användas:
ViewCompat.setElevation(textView, 1F);
ViewCompat.animate(textView);
TextViewCompat.setTextAppearance(textView, R.style.AppThemeTextStyle);
...
Definiera en menyresurs och använd den i Aktivitet / Fragment
Definiera en meny i res / menu
<?xml version="1.0" encoding="utf-8"?>
<menu
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/first_item_id"
android:orderInCategory="100"
android:title="@string/first_item_string"
android:icon="@drawable/first_item_icon"
app:showAsAction="ifRoom"/>
<item
android:id="@+id/second_item_id"
android:orderInCategory="110"
android:title="@string/second_item_string"
android:icon="@drawable/second_item_icon"
app:showAsAction="ifRoom"/>
</menu>
För fler konfigurationsalternativ, se: Menyresurs
Activity
inuti:
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
///Override defining menu resource
inflater.inflate(R.menu.menu_resource_id, menu);
super.onCreateOptionsMenu(menu, inflater);
}
@Override
public void onPrepareOptionsMenu(Menu menu) {
//Override for preparing items (setting visibility, change text, change icon...)
super.onPrepareOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
//Override it for handling items
int menuItemId = item.getItemId();
switch (menuItemId) {
case: R.id.first_item_id
return true; //return true, if is handled
}
return super.onOptionsItemSelected(item);
}
För att åberopa metoderna ovan under visningen, ring getActivity().invalidateOptionsMenu();
Inuti Fragment
behövs ytterligare ett samtal:
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
setHasOptionsMenu(true);
super.onCreateView(inflater, container, savedInstanceState);
}
Strängformatering i strings.xml
Att definiera strängar i filen strings.xml möjliggör också strängformatering. Det enda förbehållet är att strängen måste hanteras i kod som nedan, mot att helt enkelt fästa den till en layout.
<string name="welcome_trainer">Hello Pokémon Trainer, %1$s! You have caught %2$d Pokémon.</string>
String welcomePokemonTrainerText = getString(R.string.welcome_trainer, tranerName, pokemonCount);
I exemplet ovan,
% 1 $ s
"%" skiljer sig från vanliga tecken,
'1' betecknar den första parametern,
'$' används som separator mellan parameternummer och typ,
's' anger strängtyp ('d' används för heltal)
Observera att getString()
är en metod för Context
eller Resources
, dvs att du kan använda den direkt inom en Activity
, annars kan du använda getActivity().getString()
eller getContext().getString()
.
Definiera en färgtillståndslista
Färgtillståndslistor kan användas som färger, men kommer att ändras beroende på tillståndet för vyn de används för.
För att definiera en, skapar du en resursfil i res/color/foo.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="#888888" android:state_enabled="false"/>
<item android:color="@color/lightGray" android:state_selected="false"/>
<item android:color="@android:color/white" />
</selector>
Objekt utvärderas i den ordning de definieras, och det första objektet vars angivna tillstånd matchar det aktuella läget för vyn används. Så det är en bra praxis att ange en catch-all i slutet, utan att någon statliga väljare anges.
Varje objekt kan antingen använda en färgbokstav eller referera till en färg definierad någon annanstans.
Definiera sträng pluraler
För att skilja mellan plural och singular strängar kan du definiera ett plural i filen strings.xml och lista de olika mängderna, som visas i exemplet nedan:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<plurals name="hello_people">
<item quantity="one">Hello to %d person</item>
<item quantity="other">Hello to %d people</item>
</plurals>
</resources>
Denna definition kan nås från Java-kod med hjälp av getQuantityString()
metoden enligt Resources
klass, såsom visas i följande exempel:
getResources().getQuantityString(R.plurals.hello_people, 3, 3);
Här är den första parametern R.plurals.hello_people
. Den andra parametern ( 3
i detta exempel) används för att välja rätt quantity
. Den tredje parametern (även 3
i det här exemplet) är formatargumentet som kommer att användas för att ersätta formatspecifikationen %d
.
Möjliga kvantitetsvärden (listade i alfabetisk ordning) är:
few
many
one
other
two
zero
Det är viktigt att notera att inte alla orter stödjer varje quantity
. Till exempel har det kinesiska språket inte ett begrepp om one
artikel. Engelska har inte ett zero
, eftersom det grammatiskt är detsamma som other
. Icke-stödda instanser av quantity
kommer att flaggas av IDE som lintvarningar, men kommer inte att orsaka komplikationsfel om de används.
Importera matris med objekt definierade i resurser
Det finns fall där anpassade objekt måste skapas och definieras i programmets resurser. Sådana objekt kan bestå av enkla Java
typer, till exempel Integer
, Float
, String
.
Här är exemplet på hur du importerar ett objekt definierat i applikationsresurser. Objektet Category
består av 3 egenskaper i kategorin:
- ID
- Färg
- namn
Denna POJO
har motsvarande fil i categories.xml
, där varje grupp har samma egenskaper som definierats för varje kategori.
- Skapa en modell för ditt objekt:
public class Category {
private Type id;
private @ColorRes int color;
private @StringRes String name;
public Category getId() {
return id;
}
public void setId(Category id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getColor() {
return color;
}
public void setColor(int color) {
this.color = color;
}
public enum Type{
REGISTRATION,
TO_ACCEPT,
TO_COMPLETE,
TO_VERIFY,
CLOSED
}
}
- Skapa filen i mappen
res/values
Values:
categories.xml
- Komponera varje modell som består av resurser:
<array name="no_action">
<item>0</item>
<item>@android:color/transparent</item>
<item>@string/statusRegistration</item>
</array>
<array name="to_accept">
<item>1</item>
<item>@color/light_gray</item>
<item>@string/acceptance</item>
</array>
<array name="opened">
<item>2</item>
<item>@color/material_green_500</item>
<item>@string/open</item>
</array>
<array name="to_verify">
<item>3</item>
<item>@color/material_gray_800</item>
<item>@string/verification</item>
</array>
<array name="to_close">
<item>4</item>
<item>@android:color/black</item>
<item>@string/closed</item>
</array>
Definiera en matris i resursfilen:
<array name="categories"> <item>@array/no_action</item> <item>@array/to_accept</item> <item>@array/opened</item> <item>@array/to_verify</item> <item>@array/to_close</item> </array>
Skapa en funktion för att importera dem:
@NonNull public List<Category> getCategories(@NonNull Context context) { final int DEFAULT_VALUE = 0; final int ID_INDEX = 0; final int COLOR_INDEX = 1; final int LABEL_INDEX = 2; if (context == null) { return Collections.emptyList(); } // Get the array of objects from the `tasks_categories` array TypedArray statuses = context.getResources().obtainTypedArray(R.array.categories); if (statuses == null) { return Collections.emptyList(); } List<Category> categoryList = new ArrayList<>(); for (int i = 0; i < statuses.length(); i++) { int statusId = statuses.getResourceId(i, DEFAULT_VALUE); // Get the properties of one object TypedArray rawStatus = context.getResources().obtainTypedArray(statusId); Category category = new Category(); int id = rawStatus.getInteger(ID_INDEX, DEFAULT_VALUE); Category.Type categoryId; //The ID's should maintain the order with `Category.Type` switch (id) { case 0: categoryId = Category.Type.REGISTRATION; break; case 1: categoryId = Category.Type.TO_ACCEPT; break; case 2: categoryId = Category.Type.TO_COMPLETE; break; case 3: categoryId = Category.Type.TO_VERIFY; break; case 4: categoryId = Category.Type.CLOSED; break; default: categoryId = Category.Type.REGISTRATION; break; } category.setId(categoryId); category.setColor(rawStatus.getResourceId(COLOR_INDEX, DEFAULT_VALUE)); int labelId = rawStatus.getResourceId(LABEL_INDEX, DEFAULT_VALUE); category.setName(getString(context.getResources(), labelId)); categoryList.add(taskCategory); } return taskCategoryList; }
9 lappar
9 lappar är töjbara bilder där de områden som kan sträckas definieras av svarta markörer på en transparent kant.
Det finns en bra tutorial här .
Trots att det är så gammalt är det fortfarande så värdefullt och det hjälpte många av oss att djupt förstå de 9 patch-redskapen.
Tyvärr har den sidan nyligen lagts ner ett tag (den är för närvarande igen).
Därför behovet av att ha en fysisk kopia av den sidan för Android-utvecklare på våra pålitliga server / er.
Här är det.
EN ENKEL GUIDE FÖR 9-PATCH FÖR ANDROID UI 18 maj 2011
Medan jag arbetade på min första Android-app, tyckte jag att 9-patch (aka 9.png) var förvirrande och dåligt dokumenterad. Efter en liten stund tog jag slutligen upp hur det fungerar och bestämde mig för att kasta ihop något för att hjälpa andra ta reda på det.
I grund och botten använder 9-patch png-transparens för att göra en avancerad form av 9-skiva eller skala9. Guiderna är raka, svarta linjer med 1 pixel ritade på kanten av din bild som definierar skalningen och fyllningen av din bild. Genom att namnge ditt bildfilnamn.9.png kommer Android att känna igen 9.png-formatet och använda de svarta guiderna för att skala och fylla dina bitmappar.
Här är en grundläggande guide karta:
Som ni ser har du guider på varje sida av din bild. TOPPEN och VÄNSTER-guiderna är avsedda att skala din bild (dvs 9-skiva), medan RIGHT och BOTTOM-guiderna definierar fyllningsområdet.
De svarta guiderna är avskurna / borttagna från din bild - de visas inte i appen. Guider måste bara vara en pixel bred, så om du vill ha en 48 × 48-knapp blir din png faktiskt 50 × 50. Allt som är tjockare än en pixel förblir en del av din bild. (Mina exempel har 4-pixlar breda guider för bättre synlighet. De borde verkligen bara vara 1-pixel).
Dina guider måste vara helt svarta (# 000000). Även en liten färgskillnad (# 000001) eller alfa kommer att göra att den misslyckas och sträcker sig normalt. Det här felet är inte heller uppenbart *, det misslyckas tyst! Ja. Verkligen. Nu vet du.
Du bör också komma ihåg att återstående område av dispositionen med en pixel måste vara helt transparent. Detta inkluderar de fyra hörnen på bilden - de ska alltid vara tydliga. Detta kan vara ett större problem än du inser. Om du till exempel skalar en bild i Photoshop lägger den till antispionerade pixlar som kan innehålla nästan osynliga pixlar som också får den att misslyckas *. Om du måste skala i Photoshop, använd inställningen Närmaste granne i rullgardinsmenyn Återställ bild (längst ner på popup-menyn Bildstorlek) för att hålla skarpa kanter på guiderna.
* (uppdaterad 1/2012) Detta är faktiskt en "fix" i det senaste dev-kit. Tidigare skulle det manifestera sig eftersom alla dina andra bilder och resurser plötsligt bryts, inte den faktiskt trasiga 9-patch-bilden.
TOP- och LEFT-guiderna används för att definiera den skalbara delen av din bild - VÄNSTER för skalningshöjd, TOP för skalningsbredd. Med hjälp av en knappbild som ett exempel betyder det att knappen kan sträcka sig horisontellt och vertikalt inom den svarta delen och allt annat, som hörnen, kommer att förbli i samma storlek. Med detta kan du ha knappar som kan skala till valfri storlek och upprätthålla en enhetlig look.
Det är viktigt att notera att 9-patch-bilder inte skalas ner - de skalas bara upp. Så det är bäst att börja så liten som möjligt.
Du kan också lämna ut delar i mitten av skallinjen. Så till exempel, om du har en knapp med en skarp glansig kant över mitten, kan du lämna några pixlar i mitten av Vänster-guiden. Bildens mitt horisontella axel skalas inte, bara delarna ovanför och under den, så att din skarpa glans inte blir anti-alias eller fuzzy.
Fyllområdesguider är valfria och ger ett sätt att definiera området för saker som din textetikett. Fyllning avgör hur mycket utrymme det finns i din bild att placera text, eller en ikon eller andra saker. 9-patch är inte bara för knappar, det fungerar också för bakgrundsbilder.
Ovanstående knapp & etiketteksempel är överdrivna helt enkelt för att förklara tanken på fyllning - etiketten är inte helt korrekt. För att vara ärlig har jag inte upplevt hur Android gör flera radetiketter eftersom en knappetikett vanligtvis är en enda rad med text.
Slutligen, här är en bra demonstration av hur skal- och fyllguider kan variera, till exempel en LinearLayout med en bakgrundsbild och helt rundade sidor:
Med det här exemplet används Vänster-guiden inte men vi måste fortfarande ha en guide. Bakgrundsbilden skalas inte vertikalt; det skalar bara horisontellt (baserat på TOP-guiden). När man tittar på påfyllningsguiderna sträcker sig HÖGER och BOTTOM-guiderna bortom där de möter bildens böjda kanter. Detta gör att jag kan placera mina runda knappar nära bakgrunderna för en snäv, monterad look.
Så det är det. 9-patch är superlätt, när du väl har fått det. Det är inte ett perfekt sätt att göra skalning, men fyllningsområdet och flerlinjiga skalguider ger mer flexibilitet än traditionell 9-skiva och skala9. Försök och du kommer att få reda på det snabbt.
Färgtransparensnivå (Alpha)
Hex-opacitetsvärden
------------------------------
| Alpha(%) | Hex Value |
------------------------------
| 100% | FF |
| 95% | F2 |
| 90% | E6 |
| 85% | D9 |
| 80% | CC |
| 75% | BF |
| 70% | B3 |
| 65% | A6 |
| 60% | 99 |
| 55% | 8C |
| 50% | 80 |
| 45% | 73 |
| 40% | 66 |
| 35% | 59 |
| 30% | 4D |
| 25% | 40 |
| 20% | 33 |
| 15% | 26 |
| 10% | 1A |
| 5% | 0D |
| 0% | 00 |
------------------------------
Om du vill ställa in 45% på röd färg.
<color name="red_with_alpha_45">#73FF0000</color>
hexvärde för röd - # FF0000
Du kan lägga till 73 för 45% opacitet i prefixet - # 73FF0000
Arbeta med filen strings.xml
En strängaresurs ger textsträngar för din applikation med valfri textstyling och formatering. Det finns tre typer av resurser som kan ge din applikation strängar:
Sträng
XML resource that provides a single string.
Syntax:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="string_name">text_string</string>
</resources>
Och för att använda den här strängen i layout:
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/string_name" />
Sträng Array
XML resource that provides an array of strings.
Syntax:
<resources>
<string-array name="planets_array">
<item>Mercury</item>
<item>Venus</item>
<item>Earth</item>
<item>Mars</item>
</string-array>
Användande
Resources res = getResources();
String[] planets = res.getStringArray(R.array.planets_array);
Antal strängar (pluraler)
XML resource that carries different strings for pluralization.
Syntax:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<plurals
name="plural_name">
<item
quantity=["zero" | "one" | "two" | "few" | "many" | "other"]
>text_string</item>
</plurals>
</resources>
Användande:
int count = getNumberOfsongsAvailable();
Resources res = getResources();
String songsFound = res.getQuantityString(R.plurals.plural_name, count, count);