2013-03-16 8 views
6

mam dwa rodzaje działalności:Translucent motyw nie działa, gdy ustawiony programowo na Android 2.3.3 lub 4.2

public class MainActivity extends Activity { 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
} 
public void click(View view) { 
    Intent intent= new Intent(this, TranslucentActivity.class); 
    startActivity(intent);   
} 
} 

public class TranslucentActivity extends Activity { 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    this.setTheme(android.R.style.Theme_Translucent); 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_translucent); 
} 
} 

Układ activity_main

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    xmlns:android1="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context=".MainActivity" > 

    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentTop="true" 
     android:layout_centerHorizontal="true" 
     android:onClick="click" /> 
</RelativeLayout> 

Układ activity_translucent

<RelativeLayout 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" 
    tools:context=".TranslucentActivity" > 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentTop="true" 
     android:layout_centerHorizontal="true" 
     android:text="Hello_world" /> 
</RelativeLayout> 

Oczywisty

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.translucencytest" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk 
     android:minSdkVersion="8" 
     android:targetSdkVersion="17" /> 
    <application 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
     <activity 
      android:name="com.example.translucencytest.MainActivity" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <activity 
      android:name="com.example.translucencytest.TranslucentActivity"> 
     </activity> 
    </application> 
</manifest> 

Po kliknięciu przycisku w MainActivity zaczyna się TranslucentActivity z przezroczystym tłem. Wszystko wygląda dobrze w emulatorze Android na platformie 4.0.3 Ale na innych platformach, np. 2.3.3 lub 4.2, dostaję czarne tło zamiast przezroczystego. Co może być nie tak?

P.S. Nie chcę używać manifestu do deklarowania tematu działań.

+0

Właśnie przetestowałem motyw i działa zgodnie z wersjami systemu Android. Istnieje kilka rzeczy, które mogą być nie tak z twoim przykładem. Półprzezroczysty motyw pokaże okno z tyłu, więc jeśli to okno jest czarne, to nie zobaczysz przezroczystości. Jeśli nie zadeklarujesz motywu dla swojej aplikacji, nie będzie on przezroczysty, ponieważ Android użyje domyślnego motywu przed wywołaniem setTheme, a wtedy zobaczysz domyślny motyw zamiast ekranu głównego. Aby móc Ci pomóc, powinieneś przynajmniej zamieścić dwa zastosowania układu w przykładzie i manifeście –

+0

@EmanuelMoecklin Dodałem układy i manifest do mojego postu. Podejrzewam, że zamiast półprzezroczystości wyświetlany jest domyślny motyw, ale dlaczego działa on w wersji 4.0.3 i nie działa w wersjach 2.3.3 i 4.2? – Wytas

+0

Używasz własnego @ stylu/AppTheme, więc musisz to opublikować, aby móc przetestować twój przykład. Różne wersje Androida używają różnych motywów, stylów i zasobów dla tych samych elementów ekranu (widoków). Producent ma także za temat swoich urządzeń, aby odróżnić je od konkurencyjnych urządzeń. Chociaż np. domyślne tło na jednym urządzeniu może być czarne, ale może być lekko przezroczyste, a gradient na innym urządzeniu. Nie możesz naprawdę polegać na "rzeczach", aby wyglądać tak samo na każdym urządzeniu, chyba że sam je tematujesz. –

Odpowiedz

10

Istnieje wiele dyskusji na setTheme() lub raczej dlaczego setTheme() nie działa zgodnie z oczekiwaniami:

Kluczem do tej dyskusji jest to, że setTheme to robi nie działa dobrze podczas ustawiania tematu w manifeście (nawet Dianne Hackborn zaleca używanie manifestu w sposób setTheme(), patrz trzeci link powyżej). Jest to szczególnie prawdziwe, jeśli chodzi o definiowanie tła. Wyniki uzyskane w emulatorze lub edytorze graficznym niestety nie mogą zostać przeniesione do świata rzeczywistego (mówią rzeczywiste urządzenia). Więc to, co widzisz w emulatorze 4.0.3, może nie być takie samo na prawdziwym urządzeniu (jak już zauważyłeś ;-).

Jeśli nie ma konkretnego powodu, aby użyć setTheme do tematu swoją aktywność to polecam zmienić swój manifest tak:

<activity android:name=".TranslucentActivity" 
      android:theme="@android:style/Theme.Translucent"/> 

Można nadal używać setTheme na temat innych elementów układu ale haven znalazłem jakiekolwiek inne działające rozwiązanie, jeśli chodzi o tworzenie przejrzystych lub dialogowych działań.

+0

Fascynujące i dziwaczne. Znalazłem "czasem to działa, czasami nie", jeśli ustawisz 'windowBackground' na transparent IN MANIFEST. Jeśli użyjesz '@android: style/Theme.Translucent' w manifeście - wydaje się, że zawsze działa. – Fattie

0
<activity android:theme="@android:style/Theme.Translucent.NoTitleBar" 
android:name="com.example.translucencytest.MainActivity" > 
<intent-filter> 
<action android:name="android.intent.action.MAIN" /> 
<category android:name="android.intent.category.LAUNCHER" /> 
</intent-filter> 
</activity> 
<activity android:theme="@android:style/Theme.Translucent.NoTitleBar" 
android:name="com.example.translucencytest.TranslucentActivity"> 
</activity> 
+2

W moim pytaniu stwierdziłem, że nie chcę używać manifestu – Wytas

Powiązane problemy