2016-03-07 42 views
7

Câu hỏi

Làm thế nào để một programatically (không chạm vào AndroidManifext.xml) thiết lập các chủ đề của một Activityso that it looks like a dialog?cách lập trình chủ đề một hoạt động giống như một hộp thoại?

Lưu ý: Tôi đồng ý với việc sửa đổi AndroidManifext.xml miễn là nó không cần phải sửa đổi để chuyển đổi giữa làm cho nó trông giống như một hoạt động bình thường hoặc một hộp thoại.

Những gì tôi đã cố gắng cho đến nay

Tôi đã thử các sau đây theo this stackoverflow answer:

public class DialogActivity extends Activity 
{ 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     setTheme(android.R.style.Theme_DeviceDefault_Dialog); 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_dialog); 
     Log.d(TAG,"Build.VERSION.SDK_INT: "+Build.VERSION.SDK_INT); // 23 
    } 
} 

Nhưng nó kết thúc lên blacking out everything in the background.

Tôi cũng thấy this stackoverflow answer, và cố gắng:

public class DialogActivity extends Activity 
{ 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     setTheme(android.R.style.Theme_DeviceDefault_Dialog); 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_dialog); 
     getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT)); 
    } 
} 

nhưng nó kết thúc lên làm everything black.

Làm gì? Cảm ơn bạn.

+0

Có thể trùng lặp: http://stackoverflow.com/questions/1979369/android-activity-as-a-dialog. Có thể bạn cũng có thể quan tâm đến điều này: https://github.com/pingpongboss/StandOut –

+0

@NguyenDoanTung cảm ơn bạn. Tôi cũng thấy bài viết đó, nhưng hầu hết các câu trả lời đó liên quan đến việc sửa đổi 'AndroidManifest.xml' mà tôi không muốn làm. Tôi đã thử phương pháp đầu tiên được đề cập trong http://stackoverflow.com/a/22216966/2898715, nhưng nó không tạo ra kết quả khả quan như đã đề cập trong câu hỏi của tôi. Ngoài ra, cảm ơn bạn đã liên kết github, tôi đã kiểm tra nó ra, tuy nhiên tôi thực sự hy vọng có một giải pháp đơn giản hơn. – Eric

Trả lời

8

nền

Các Activity đằng sau một Acivity được rút ra nếu chủ đề hoạt động foreground của theo AndroidManifest.xml của nó là một hộp thoại; nếu không hệ điều hành android sẽ không vẽ Activity đằng sau nó (có thể để tiết kiệm bộ nhớ vì nó thường sẽ không được nhìn thấy anyway).

Để khai thác điều này, chúng tôi đặt chủ đề của Acitvity thành hộp thoại trong tệp kê khai, làm cho hệ điều hành android vẽ Activity đằng sau nó, nhưng sau đó, lập trình chủ đề của chúng tôi theo bất kỳ điều gì chúng tôi thích khi chạy.

Tutorial

Bước 1: tạo ra hai chủ đề tùy chỉnh cho ứng dụng của bạn trong styles.xml. Một cho hoạt động bình thường, và một cho hoạt động thoại. Điều quan trọng là chủ đề hộp thoại tùy chỉnh kế thừa từ một chủ đề cơ bản cũng là một hộp thoại. Trong trường hợp của tôi, chủ đề gốc là Base.Theme.AppCompat.Light.Dialog.FixedSize). Đây là tôi styles.xml:

<resources> 

    <!-- custom normal activity theme -->  
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> 
    </style> 

    <!-- custom dialog activity theme --> 
    <style name="AppTheme.Dialog" parent="Base.Theme.AppCompat.Light.Dialog.FixedSize"> 
     <!-- removing the dialog's action bar --> 
     <item name="windowActionBar">false</item> 
     <item name="windowNoTitle">true</item> 
    </style> 

</resources> 

Bước 2: trong AndroidManifest.xml, thiết lập các chủ đề của Activity trong câu hỏi cho bất kỳ chủ đề hộp thoại. Điều này làm cho hệ điều hành Android nghĩ rằng Activity là một hộp thoại, vì vậy nó sẽ vẽ Activity đằng sau nó, và không phải màu đen nó ra. Trong trường hợp của tôi, tôi đã sử dụng Theme.AppCompat.Dialog. Dưới đây là tôi AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
      package="com.example.eric.questiondialog_artifact"> 

    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name"> 
     <activity 
      android:name=".DialogActivity" 
      android:label="@string/app_name" 
      android:theme="@style/Theme.AppCompat.Dialog"> <-- IMPORTANT!!! --> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN"/> 
       <category android:name="android.intent.category.LAUNCHER"/> 
      </intent-filter> 
     </activity> 
    </application> 

</manifest> 

Bước 3: trong hoạt động thực tế, thiết lập các chủ đề programatically hoặc là chủ đề cho các hoạt động bình thường, hoặc các chủ đề cho các hộp thoại.DialogActivity.java của tôi là dưới đây:

package com.example.eric.questiondialog_artifact; 

import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.Toolbar; 

public class DialogActivity extends AppCompatActivity 
{ 
    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     setTheme(R.style.AppTheme_Dialog); // can either use R.style.AppTheme_Dialog or R.style.AppTheme as deined in styles.xml 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_dialog); 
    } 
} 
+1

awsome !!! 'setTheme (R.style.AppTheme_Dialog);' là lời cảm ơn thực sự quan trọng! – Phoenix

1

nếu bạn đang tìm kiếm những gì chỉ là một chủ đề với nền trong suốt cho bạn hoạt động, chỉ cần sử dụng này:

<style name="Theme.Transparent" parent="android:Theme"> 
    <item name="android:windowIsTranslucent">true</item> 
    <item name="android:windowBackground">@android:color/transparent</item> 
    <item name="android:windowContentOverlay">@null</item> 
    <item name="android:windowNoTitle">true</item> 
    <item name="android:windowIsFloating">true</item> 
    <item name="android:backgroundDimEnabled">false</item> 
</style> 

áp dụng phong cách này để hoạt động của bạn trong AndroidManifest của bạn nộp và đây là nó

0

Hãy thử những mã trước khi dailog.setMessage(...);

Dialog id = new AlertDialog.Builder(this,AlertDialog.THEME_DEVICE_DEFAULT_DARK); 

Dialog ID = new AlertDialog.Builder(this,AlertDialog.THEME_DEVICE_DEFAULT_LIGHT); 

//Default theme 

Hãy thử điều này cho Old chủ đề Dialog ID = new AlertDialog.Builder(this,AlertDialog.THEME_TRADITIONAL);

Hãy thử những cho chủ đề KitKat

Dialog ID = new AlertDialog.Builder(this,AlertDialog.THEME_DEVICE_DEFAULT_DARK); //Dark 


Dialog ID = new AlertDialog.Builder(this,AlertDialog.THEME_HOLO_LIGHT); 

Hãy thử những mã cho thực dụng

Exmaple

dialog = new AlertDialog.Builder(this); 
      dialog = new AlertDialog.Builder(this,AlertDialog.THEME_DEVICE_DEFAULT_DARK); 
      dialog.setTitle("HAI"); 
      dialog.setMessage("look"); 
      dialog.setPositiveButton("Ok", new DialogInterface.OnClickListener() { 
Toast toast= Toast.makeText(getApplicationContext(), "This is exmaple theme", Toast.LENGTH_LONG); 
Các vấn đề liên quan