2013-03-16 20 views
0

我想爲我的應用添加兩個不同的主題(明暗)。用戶從菜單中選擇它。使用文件在運行時爲Android應用設置不同的主題

這是我做過什麼:

package com.example; 

import java.io.*; 

public class setTheme { 


    void write(int n) throws IOException 
    { 

     File myFile = new File("/mnt/sdcard/theme.txt"); 

     if(!myFile.exists()){ 
      myFile.createNewFile(); 
     } 
     if(myFile.exists()){ 
      myFile.delete(); 
      myFile.createNewFile(); 
     } 
      FileWriter Fr = new FileWriter(myFile); 
      BufferedWriter Br =new BufferedWriter(Fr); 
      PrintWriter P =new PrintWriter(Br); 
      P.println(n); 
      P.close(); 

    } 
    static int read() throws IOException 
    { 

      int mnum=0; 
      File myFile = new File("/mnt/sdcard/theme.txt"); 
      if (!myFile.exists()) { 
       return 1; 
      } 
      FileReader fr = new FileReader(myFile); 
      BufferedReader br = new BufferedReader(fr); 
      @SuppressWarnings("unused") 
      String txt = ""; 
      while ((txt = br.readLine()) != null) 
      { 
       mnum=Integer.parseInt(br.readLine()); 
      } 
      br.close(); 
      return mnum; 



    } 

} 

這是在MainActivity:

package com.example; 

import java.io.IOException; 

import android.net.Uri; 
import android.os.Bundle; 
import android.app.Activity; 
import android.content.Intent; 
import android.view.Menu; 
import android.view.MenuInflater; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.Toast; 

public class MainActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 

       try { 
        if (setTheme.read()==1) { 
         getApplication().setTheme(R.style.LightTheme); 
         super.onCreate(savedInstanceState); 
         setContentView(R.layout.activity_main);} 
        else if(setTheme.read()==2) { 
         getApplication().setTheme(R.style.DarkTheme); 
         super.onCreate(savedInstanceState); 
         setContentView(R.layout.activity_main);}    
       } 

       catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     MenuInflater inflater = getMenuInflater(); 
     inflater.inflate(R.menu.activity_main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle item selection 
     switch (item.getItemId()) { 
      case R.id.menu_help: 
       Intent intent = new Intent(this, HelpActivity.class); 
       startActivity(intent); 
       return true; 
      case R.id.menu_more: 
       Intent myWebLink = new Intent(android.content.Intent.ACTION_VIEW); 
       myWebLink.setData(Uri.parse("https://play.google.com/store/apps/developer?id=******")); 
       startActivity(myWebLink); 
       return true; 
      case R.id.menu_lightTheme: 
       setTheme(1); 
       Toast.makeText(getApplicationContext(), "Restart app for changes to take place", Toast.LENGTH_SHORT).show(); 
       return true; 
      case R.id.menu_darkTheme: 
       setTheme(1); 
       Toast.makeText(getApplicationContext(), "Restart app for changes to take place", Toast.LENGTH_SHORT).show(); 
       return true; 
      default: 
       return super.onOptionsItemSelected(item); 
     } 
    } 

Styles.xml:

<style name="LightTheme" parent="@android:style/Theme.Holo.Light.DarkActionBar"> 
</style> 

<style name="DarkTheme" parent="@android:style/Theme.Holo"> <style> 

然而,上運行的應用程序,它始終走白色主題,即使在菜單選擇後。我究竟做錯了什麼?

謝謝。

回答

0

您可以使用偏好活動來做到這一點,以允許用戶選擇主題。
在你pereference XML創建ListPreference

<ListPreference 
    android:key="THEME_PREF" 
    android:title="Theme" 
    android:entries="@array/themesArray" 
    android:entryValues="@array/themesArrayValues" 
    android:summary="Enter summary here" 
/> 

將這個在的setContentView(之前的onCreate()您的活動),或在的onResume()

SharedPreferences mysettings2 = PreferenceManager.getDefaultSharedPreferences(this); 
String st1 = mysettings2.getString("THEME_PREF", "Light"); 
if(st1.equals("Light")) 
    {setTheme(R.style....); } 
if(st1.equals("Dark")) 
    {setTheme(R.style....); } 

注意:您可能需要重新啓動應用程序使更改生效。

這裏是陣列的一個例子:

<string-array name="themesArray"> 
    <item>Light</item> 
    <item>Dark</item> 
</string-array>  

<string-array name="themesArrayValues"> 
    <item>"Light"</item> 
    <item>"Dark"</item> 
</string-array> 
+0

關於重啓部分,我用onRestart(),所以它的工作原理!謝謝。 setTheme()作爲一個整體不工作,所以我用super.setTheme()。 – Avijit 2013-04-01 07:23:16

相關問題