2013-03-07 7 views
7

więc problem jest bardzo prosta:DataPicker wygląda starego wzoru na nowe API, jak również

mam zintegrowany DatePicker w mojej aplikacji. Nie jako DialogDatePicker, ale jako komponent Widok (a dokładniej View wewnątrz Fragment, który jest dynamicznie wyświetlany i usuwany z FrameLayout zawartego w moim głównym układzie FragmentActiviy).

teraz moim problemem jest to, że DataPicker wygląda następująco: enter image description here

i nie podoba:

enter image description here

nawet kiedy kierować wyższe API, próbowałem ustawienie moim Min SDK 16 lub 17, ale też nie pomogło.

Ktoś wie, dlaczego to się dzieje? i jak mogę pokazać nowy wygląd selektora danych? najlepiej na starych wersjach Androida?

Każda pomoc zostanie doceniona.

Dzięki.

EDIT: Kod:

DataPickerFragment xml: klasa

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" 
    android:paddingLeft="6.5dp" 
    android:paddingTop="6dp" 
    android:paddingRight="8.5dp" 
    android:paddingBottom="8.5dp" 
    android:background="@drawable/date_picker_background"> 

    <DatePicker 
     android:id="@+id/datePicker" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_margin="10dp" 
     android:paddingBottom="40dp" /> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

     <Button 
      android:id="@+id/bCancel" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_gravity="bottom" 
      android:layout_weight="1.0" 
      android:onClick="buttonCanceDatePickerOnclick" 
      android:text="@string/cancel" /> 

     <Button 
      android:id="@+id/bSave" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_gravity="bottom" 
      android:layout_weight="1.0" 
      android:onClick="buttonSaveDatePickerOnclick" 
      android:text="@string/save" /> 

    </LinearLayout> 
</FrameLayout> 

DataPickerFramgnet:

public class DatePickerFragment extends Fragment { 

    private Button bSave, bCancel; 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.date_picker_fragment_layout, 
             container, false); 
     return rootView; 
    } 
} 

UPDATE:

Manifast file:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.emildesign.sgreportmanager" 
android:versionCode="1" 
android:versionName="1.0"> 

    <uses-sdk 
     android:minSdkVersion="13" 
     android:targetSdkVersion="17" /> 

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 

    <!-- Crittercism --> 
    <uses-permission android:name="android.permission.READ_LOGS"/> 
    <uses-permission android:name="android.permission.GET_TASKS"/> 

    <application 
     android:allowBackup="true" 
     android:name="com.emildesign.sgreportmanager.SGRaportManagerAppObj" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen"> 

     <activity 
      android:name="com.emildesign.sgreportmanager.activities.LoginScrActivity" 
      android:screenOrientation="landscape"> 

      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <activity 
      android:name="com.emildesign.sgreportmanager.activities.ReportsTableActivity" 
      android:screenOrientation="landscape"> 
     </activity> 
     <activity 
      android:name="com.emildesign.sgreportmanager.activities.ParametersActivity" 
      android:screenOrientation="landscape"> 
     </activity> 
     <activity android:name="com.crittercism.NotificationActivity"/> 
</application> 

dobrze znalazłem gdzie mój problem, ja ustawić:

android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen" 

aby moja aplikacja pełnego ekranu i ten zastosował stary styl selektora danych zmieniając go na:

android:theme="@android:style/Theme.Holo.Light.NoActionBar.Fullscreen" 

tworzy następujące DataPicker:

enter image description here

to lepiej niż wcześniej, ale to wciąż nie jest wynikiem szukam.

+0

Gdzie jest wyświetlane okno dialogowe ustawiania daty? –

+0

Chcę wiedzieć też – Intathep

+0

@Ian Carroll, nie zrozumiałem twojego pytania. –

Odpowiedz

4

Ustaw swój android:targetSdkVersion na 11 lub więcej. Here is a sample application demonstrating this.


UPDATE

pierwsze oryginalny DatePicker ekranu jest z ciemnego rozrywki (np Theme.Holo), podczas gdy jej druga ekranu jest z lekkiego rozrywki (np Theme.Holo.Light).

drugie, dokumentacja DatePicker ma następujący akapit otwarcia:

Ta klasa jest widget do wyboru daty. Data może być wybrana przez rok, miesiąc i dzień obrót lub CalendarView. Zestaw bączków i widok kalendarza są automatycznie synchronizowane. Klient może dostosować, czy mają być wyświetlane tylko obrotówki, czy tylko widok kalendarza. Również minimalna i maksymalna data, od której można wybierać daty, można dostosować.

można pozbyć się CalendarView poprzez android:calendarViewShown (lub setCalendarViewShown()). Gdy spróbujesz tego, okaże się, że twój rok obrotowy pojawi się, gdy zniknie CalendarView.

+2

Aktualnie kierujemy się na SDK 17 i nadal wygląda tak ... –

+0

@EmilAdz: Podejrzewam, że jesteś ustawiasz cel budowy na 17, ale nie ustawiasz wartości "android: targetSdkVersion" na 11 lub więcej. Cel kompilacji i 'android: targetSdkVersion' są niezależnymi koncepcjami. – CommonsWare

+0

Proszę zobaczyć aktualizację, o której mowa. –

3

Musisz użyć motywu Holo.

Tak, Twój motyw powinien wyglądać następująco:

<style name="AppTheme" parent="@android:style/Theme.Holo"> 
    ... 
</style> 
+0

jest to prawdopodobnie ten styl tylko do DataPicker? –

+0

Nie sądzę. –

+1

@EmilAdz Możesz utworzyć nową aktywność, aby owinąć DatePicker i ustawić "android: theme =" @ android: style/Theme.Holo.Light "" w swoim AndroidManifest.xml tylko w sekcji tego działania. Właśnie to przetestowałem, to działa. –

1

Odpowiadając do aktualizacji

Zmienić

android:theme="@android:style/Theme.Holo.Light.NoActionBar.Fullscreen"

do

android:theme="@android:style/Theme.Holo.NoActionBar.Fullscreen"

+0

Tak, już to zrozumiałem, ale czy istnieje sposób na użycie tego samego DatePicker w starszych wersjach? i czy istnieje sposób edycji tego, jak wygląda ten DatePicker, muszę zmienić niebieskie linie na biały i zmienić kolor tekstu? czy to możliwe? –

+1

Nie wierzę, że możesz ustawić ten motyw na starszych wersjach Androida. Jeśli wszystko rozumiem poprawnie, sam motyw jest częścią systemu operacyjnego, wszystkie rysunki, kolory, marginesy, widget, cały wygląd i styl, wszystko to jest przechowywane w systemie operacyjnym, a nie w aplikacji. Twoja aplikacja zasadniczo mówi systemowi operacyjnemu "Narysuj to okno dialogowe w Theme.Holo!". Starsze wersje Androida po prostu nie mają tego tematu, więc nie mogą go narysować. –

+0

@EmilAdz Właściwie to sprawdziłem i technicznie można to zrobić, ale musiałbyś połączyć wszystkie zasoby tematu z aplikacją. Spójrz na te dwa pytania i odpowiedzi: http://stackoverflow.com/questions/9649634/set-holo-theme-in-older-android-versions i http://stackoverflow.com/questions/10274015/setting -holo-theme-dla-android-aplikacji –

-2

Trzeba użyć DialogFragment na skutek czego szukasz:

http://developer.android.com/guide/topics/ui/controls/pickers.html

+0

Dobrze jest komentować, jeśli się zgodzisz. –

+0

??? nie rozumiem, dlaczego udzielisz mi odpowiedzi, jeśli jest to dokładnie to, czego chce użytkownik, i nie sądzę, że twój komentarz pomoże, jeśli spróbujesz mi pomóc. – Rensodarwin

+0

Patrząc na zaakceptowaną odpowiedź, najwyraźniej nie jest to, o co prosił OP. Ale nie jestem programistą systemu Android, więc użytkownicy powinni reagować. –

0

Oto urywek za wywołanie domyślnego Data urządzenia i czas Picker

date_time_layout.xml

<?xml version="1.0" encoding="utf-8"?> 
    <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:gravity="center" > 

     <LinearLayout 
      android:id="@+id/linearLayout1" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:gravity="center" 
      android:orientation="vertical" > 

      <DatePicker 
       android:id="@+id/datePicker1" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:calendarViewShown="false" > <!-- style="@style/date_picker_style" --> 
      </DatePicker> 

      <TimePicker 
       android:id="@+id/timePicker1" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" > 
      </TimePicker> 

      <LinearLayout 
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content" > 

       <Button 
        android:id="@+id/dialogCancel" 
        android:layout_width="0dip" 
        android:layout_height="wrap_content" 
        android:layout_weight="1" 
        android:text="Cancel" /> 

       <Button 
        android:id="@+id/dialogSet" 
        android:layout_width="0dip" 
        android:layout_height="wrap_content" 
        android:layout_weight="1" 
        android:text="Set" /> 
      </LinearLayout> 
     </LinearLayout> 

    </ScrollView> 

Umieść tę metodę na swojej klasie i wywołaj ją przy użyciu metody showDateAndTimePicker();

private void showDateAndTimePicker() { 
     final Dialog dialog = new Dialog(this, 
       android.R.style.Theme_DeviceDefault_Dialog); 

     dialog.setContentView(R.layout.date_time_layout); 
     dialog.setCancelable(false); 
     dialog.setTitle("Select Date and Time"); 
     Button set = (Button) dialog.findViewById(R.id.dialogSet); 
     Button cancel = (Button) dialog.findViewById(R.id.dialogCancel); 
     final DatePicker dtp = (DatePicker) dialog 
       .findViewById(R.id.datePicker1); 
     final TimePicker tp = (TimePicker) dialog 
       .findViewById(R.id.timePicker1); 
     set.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // Handle Set button 
       dialog.dismiss(); 

      } 
     }); 
     cancel.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       //Handle Cancel button 
       dialog.dismiss(); 
      } 
      }); 
      dialog.show(); 
     } 
Powiązane problemy