2012-04-23 40 views
9

Tôi đang xây dựng ứng dụng cho tab.Hộp thoại hoạt động với tab

  1. Khi được nhấp nút của tôi đang cố gắng để hiển thị hoạt động (chẳng hạn Một) với chủ đề @android:style/Theme.Dialog
  2. Bên trong hoạt động Một tôi đang tạo ra actionbar và thêm 4 tab.
  3. Khi nhấp vào tab Tôi muốn thay đổi phân đoạn.

Tất cả mọi thứ hoạt động tốt cho đến khi tôi không áp dụng theme @android:style/Theme.Dialog Sau khi áp dụng chủ đề Tôi nhận được ngoại lệ:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.ebuilder/com.ebuilder.views.MyTabActivity}: java.lang.NullPointerException 

tại dòng sau:

actionBar.addTab(actionBar.newTab().setCustomView(R.layout.tab_home). 
        setTabListener(homeListener), 0); 

Tôi có hai câu hỏi:

1. Điều gì sẽ xảy ra nếu tôi áp dụng chúng hộp thoại e?

2. Cách tiếp cận của tôi có đúng không?

Hãy cho tôi biết nếu có ai biết cách tiếp cận khác.

Edit1: * Manifest tập tin *

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

    <uses-sdk android:targetSdkVersion="14"/> 

    <application 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" > 
     <activity 
      android:name=".FragmentInsideFragmentTestActivity" 
      android:label="@string/app_name" 
      android:theme="@style/Theme.CustomDialog" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 

</manifest> 

res/values ​​/ style.xml

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <style name="Theme.CustomDialog" parent="android:style/Theme.Dialog"> 
      <item name="android:windowNoTitle">false</item> 
      <item name="android:windowActionBar">true</item>   
    </style> 
</resources> 

Edit2

05-03 21:42:10.580: D/AndroidRuntime(533): Shutting down VM 
05-03 21:42:10.580: W/dalvikvm(533): threadid=1: thread exiting with uncaught exception (group=0x40014760) 
05-03 21:42:10.600: E/AndroidRuntime(533): FATAL EXCEPTION: main 
05-03 21:42:10.600: E/AndroidRuntime(533): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.vivek/com.vivek.FragmentInsideFragmentTestActivity}: java.lang.IllegalStateException: ActionBarImpl can only be used with a compatible window decor layout 
05-03 21:42:10.600: E/AndroidRuntime(533): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1748) 
05-03 21:42:10.600: E/AndroidRuntime(533): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1764) 
05-03 21:42:10.600: E/AndroidRuntime(533): at android.app.ActivityThread.access$1500(ActivityThread.java:122) 
05-03 21:42:10.600: E/AndroidRuntime(533): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1002) 
05-03 21:42:10.600: E/AndroidRuntime(533): at android.os.Handler.dispatchMessage(Handler.java:99) 
05-03 21:42:10.600: E/AndroidRuntime(533): at android.os.Looper.loop(Looper.java:132) 
05-03 21:42:10.600: E/AndroidRuntime(533): at android.app.ActivityThread.main(ActivityThread.java:4025) 
05-03 21:42:10.600: E/AndroidRuntime(533): at java.lang.reflect.Method.invokeNative(Native Method) 
05-03 21:42:10.600: E/AndroidRuntime(533): at java.lang.reflect.Method.invoke(Method.java:491) 
05-03 21:42:10.600: E/AndroidRuntime(533): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841) 
05-03 21:42:10.600: E/AndroidRuntime(533): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599) 
05-03 21:42:10.600: E/AndroidRuntime(533): at dalvik.system.NativeStart.main(Native Method) 
05-03 21:42:10.600: E/AndroidRuntime(533): Caused by: java.lang.IllegalStateException: ActionBarImpl can only be used with a compatible window decor layout 
05-03 21:42:10.600: E/AndroidRuntime(533): at com.android.internal.app.ActionBarImpl.init(ActionBarImpl.java:214) 
05-03 21:42:10.600: E/AndroidRuntime(533): at com.android.internal.app.ActionBarImpl.<init>(ActionBarImpl.java:192) 
05-03 21:42:10.600: E/AndroidRuntime(533): at android.app.Activity.initActionBar(Activity.java:1767) 
05-03 21:42:10.600: E/AndroidRuntime(533): at android.app.Activity.setContentView(Activity.java:1781) 
05-03 21:42:10.600: E/AndroidRuntime(533): at com.vivek.FragmentInsideFragmentTestActivity.onCreate(FragmentInsideFragmentTestActivity.java:47) 
05-03 21:42:10.600: E/AndroidRuntime(533): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1048) 
05-03 21:42:10.600: E/AndroidRuntime(533): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1712) 
05-03 21:42:10.600: E/AndroidRuntime(533): ... 11 more 
+0

Tôi khuyên bạn nên tạo tab trong các vết cắn thay vì thực hiện nó trong một đoạn lớn. Sau đó, bạn có thể xác định exacly những gì cung cấp cho nullpointer. Nullpointer nên khá đơn giản để giải quyết. – Warpzit

+1

không thực sự actionBar chính nó là null nếu tôi áp dụng chủ đề 'Theme.Dialog' do đó là ngoại lệ. – Vivek

+0

Đoán của tôi (đoán của nó) là chủ đề của hộp thoại không có tiêu đề và vì thanh tác vụ nằm sâu xuống là thanh tiêu đề, điều này có nghĩa là không có thanh tác vụ nào do đó không có. Có thể sử dụng một chủ đề khác không? – Warpzit

Trả lời

0

Bạn có thể tạo chủ đề hộp thoại tùy chỉnh bằng cách ghi đè các thuộc tính của hộp thoại mà bạn không cần cho thanh tác vụ. Ngoài ra, hãy thêm thuộc tính android:windowActionBar vào nó.

<style name="Theme.CustomDialog" parent="android:Theme.Holo.Dialog"> 
    <item name="android:windowNoTitle">false</item> 
    <item name="android:windowActionBar">true</item> 
    ... 
</style> 
+0

Nếu tôi áp dụng chủ đề này, hãy nhận 'java.lang.IllegalStateException: ActionBarImpl chỉ có thể được sử dụng với bố trí trang trí cửa sổ tương thích 'lỗi này – Vivek

+0

Điều này sẽ hoạt động. Bạn có chắc là bạn đã đặt thuộc tính 'parent =" android: style/Theme.Dialog "' trong thẻ kiểu? thử mà không có mục 'windowNoTitle' .. – Ronnie

+0

Hey thay đổi' Theme.dialog' thành 'android: Theme.Holo.Dialog' tương đương. Đây là chủ đề Hộp thoại mặc định cho các ứng dụng nhắm mục tiêu Honeycomb hoặc mới hơn. 'Theme.dialog' được báo cáo là bị hỏng ... – Ronnie

1

Tôi đang vật lộn với cùng một vấn đề ở đây và tìm thấy hai cách tiếp cận khác nhau cho đến nay.

Mô tả đầu tiên được mô tả here là cái tôi đã sử dụng.

Ngoài ra còn có this câu trả lời trông rất giống với câu trả lời đầu tiên.

Vấn đề lớn có vẻ là ActionBar chỉ được sử dụng trên Bố cục toàn màn hình, vì vậy mọi thứ cố gắng áp dụng bố cục kiểu hộp thoại sẽ gây ra ngoại lệ. Vì vậy, đó là lý do tại sao cả hai người trong số họ đang thiết lập Chiều rộng tại this.getWindow().setAttributes với một giá trị cố định, để giải quyết vấn đề.

Đó là kết luận mà tôi nghĩ ra, hy vọng nó giúp bất kỳ ai khác tìm kiếm điều này, vì đây là một câu hỏi rất cũ.

Các vấn đề liên quan