2017-10-18 2 views
0
@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     case R.id.action_create: //run NoteActivity in new note mode 
      startActivity(new Intent(this, NoteActivity.class)); 
      break; 
     case R.id.action_theme: 
      setTheme(R.style.Theme2); 
      setContentView(R.layout.activity_main); 
      Intent i = getIntent(); 
      i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
      startActivity(i); 

      // TODO: show settings activity 

      break; 
    } 

    return super.onOptionsItemSelected(item); 
} 

Ich habe einen Menüpunkt oben auf meiner Aktivität. Ich möchte es verwenden, um das Thema zu ändern, wenn es gedrückt wird. Ich möchte dies tun, nachdem der Benutzer das Programm gestartet hat, und es wird schließlich verwendet, um durch eine Reihe von verschiedenen Themen zu fahren! Gerade jetzt möchte ich es nur mit einem arbeiten lassen. Wie kann ich das machen?Ändern Sie das Thema programmgesteuert nach onCreate()

Meine Antwort

Hauptaktivität

SharedPreferences pref; 
SharedPreferences.Editor editor; 
int check; 
int newcheck; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    pref = getApplicationContext().getSharedPreferences("test", Context.MODE_PRIVATE); 
    check = pref.getInt("x", 0); 
    if(check == 0){ 
     setTheme(R.style.AppTheme); 
    }else{ 
     setTheme(R.style.Theme2); 
    } 

    setContentView(R.layout.activity_main); 
    noteActivity = new NoteActivity(); 
    mListNotes = (ListView) findViewById(R.id.main_listview); 
} 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 

     switch (item.getItemId()) { 
      case R.id.action_create: //run NoteActivity in new note mode 
       startActivity(new Intent(this, NoteActivity.class)); 
       break; 
      case R.id.action_theme: 
       pref = getApplicationContext().getSharedPreferences("test", Context.MODE_PRIVATE); 
       editor = pref.edit(); 
       newcheck = pref.getInt("x",0); 
       if(newcheck == 0) { 
        newcheck = 1; 
       }else if(newcheck == 1){ 
        newcheck = 0; 
       } 
       editor.clear();//clears the editor to avoid errors 
       editor.putInt("x",newcheck);//add in new int 
       editor.commit();//commit 

       //restart the activity 
       Intent i = getIntent(); 
       i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
       finish();//close activity - avoid crash 
       startActivity(i);//start activity 

       //TODO show settings activity 
       break; 
     } 
     return super.onOptionsItemSelected(item); 
    } 
+0

Also, was ist das Problem, mit dem Sie gerade konfrontiert sind? Das Thema ist nicht richtig eingestellt? –

+0

Wenn ich den Knopf drücke, ändert sich das Thema nicht. Ich habe es in der onCreate() -Methode getestet, also ist das Thema richtig eingerichtet. – pewpew

+0

Warum starten Sie die Aktivität dann wieder? Sie sollten einfach die 'setTheme' Funktion verwenden und das war's. –

Antwort

1

So soweit ich das Problem verstanden habe, könnte man denken, nehmen ein Elternteil Activity und stellen so eine Fragment dort betrachten dass Sie das Thema Ihrer Fragment ändern können, wo die Kontrolle über das Ändern des Designs von Ihrem Elternteil Activity ist. So können Sie dieses Verhalten erreichen.

  • ein Fragment Container in Ihrem Activity Erhalten Sie und Ihre Fragment in diesem Container in der onCreate Funktion Ihres Activity starten.
  • Da Sie eine Menüoptionsschaltfläche haben, um zu entscheiden, welches Thema in Fragment bereitgestellt werden soll, können Sie Ihre Fragment erneut ersetzen, indem Sie eine andere Fragmenttransaktion ausführen, wenn Sie auf die Menüoption klicken.
  • Sie betrachten könnte das ausgewählte Thema in SharedPreferences Speichern, so dass jedes Mal, wenn Ihr Fragment startet, können Sie das Thema richtig, indem Sie es in Ihrem onCreateView Funktion Ihres Fragment nach dem Lesen der ausgewählten Thema aus Ihrem SharedPreferences einstellen.

Nun, wenn Sie denken, wie Sie ein Thema festlegen können in Ihrem Fragment dann this post könnten Sie in dieser Hinsicht helfen. Ich kopiere den Code von dort für Ihre Bequemlichkeit.

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

    // create ContextThemeWrapper from the original Activity Context with the custom theme 
    final Context contextThemeWrapper = new ContextThemeWrapper(getActivity(), R.style.yourCustomTheme); 

    // clone the inflater using the ContextThemeWrapper 
    LayoutInflater localInflater = inflater.cloneInContext(contextThemeWrapper); 

    // inflate the layout using the cloned inflater, not default inflater 
    return localInflater.inflate(R.layout.yourLayout, container, false); 
} 

Ich hoffe, Sie bekommen die Idee schon. Bitte lassen Sie es mich wissen, wenn es noch etwas Klärungsbedarf gibt.

+0

Danke, aber ich habe einen anderen Weg gefunden. +1 – pewpew

+0

Das einzige Problem, das ich jetzt habe, ist, dass, wenn ich das Programm schließe und wieder öffne, es abstürzt, wenn ich versuche, den Stil/das Thema zu ändern. – pewpew

+1

ich habe es herausgefunden ... – pewpew

Verwandte Themen