it-swarm.com.de

Android - App-Design auf onClick ändern

ich weiß, dass es eine Möglichkeit gibt, das Standarddesign der App beim Klicken auf eine Schaltfläche zu ändern. Blackmart-Entwickler haben es geschafft. Ich habe Google bereits nach 1000 Seiten durchsucht, aber ich habe nur diese gefunden (funktioniert nicht).

getApplication().setTheme(Theme.Holo)

Da ich bereits einen neuen Stil in res/values ​​/ styles.xml erstellt habe, gibt es eine andere Möglichkeit, ihn dynamisch zu ändern? Starten Sie die Anwendung überhaupt neu?

48
user2606414

Der folgende Blog kann Ihr Problem lösen:

http://de.mrbool.com/de/wie-das-Layout-thema-der-android-Anwendung-ändern/25837

Kopieren des Blog-Codes zum schnellen Nachschlagen:

Angenommen, Sie haben bereits drei Themen in der XML-Datei R.style.FirstTheme, R.style.SecondTheme Und R.style.ThirdTheme Definiert.

import Android.app.Activity;
import Android.os.Bundle;
import Android.view.View;
import Android.view.View.OnClickListener;
public class ChangeThemeActivity extends Activity implements OnClickListener
{
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        Utils.onActivityCreateSetTheme(this);
        setContentView(R.layout.main);

                    findViewById(R.id.button1).setOnClickListener(this);
          findViewById(R.id.button2).setOnClickListener(this);
          findViewById(R.id.button3).setOnClickListener(this);
    }
     @Override
     public void onClick(View v)
     {
          // TODO Auto-generated method stub
          switch (v.getId())
          {
          case R.id.button1:
          Utils.changeToTheme(this, Utils.THEME_DEFAULT);
          break;
          case R.id.button2:
          Utils.changeToTheme(this, Utils.THEME_WHITE);
          break;
          case R.id.button3:
          Utils.changeToTheme(this, Utils.THEME_BLUE);
          break;
          }
     }
}

Schreiben wir den folgenden Code in die Datei "Utils":

import Android.app.Activity;
import Android.content.Intent;
public class Utils
{
     private static int sTheme;
     public final static int THEME_DEFAULT = 0;
     public final static int THEME_WHITE = 1;
     public final static int THEME_BLUE = 2;
     /**
      * Set the theme of the Activity, and restart it by creating a new Activity of the same type.
      */
     public static void changeToTheme(Activity activity, int theme)
     {
          sTheme = theme;
          activity.finish();
activity.startActivity(new Intent(activity, activity.getClass()));
     }
     /** Set the theme of the activity, according to the configuration. */
     public static void onActivityCreateSetTheme(Activity activity)
     {
          switch (sTheme)
          {
          default:
          case THEME_DEFAULT:
              activity.setTheme(R.style.FirstTheme);
              break;
          case THEME_WHITE:
              activity.setTheme(R.style.SecondTheme);
              break;
          case THEME_BLUE:
              activity.setTheme(R.style.Thirdheme);
              break;
          }
     }
}

Ich hoffe es hilft...

EDIT 1:

dies ist der Grund, warum AlertDialog kein benutzerdefiniertes Design annimmt:

Die Implementierung in Builder.create () ist:

public AlertDialog create() {
    final AlertDialog dialog = new AlertDialog(P.mContext);
    P.apply(dialog.mAlert);
    [...]
}

dies ruft den Konstruktor "Nicht themenorientiert" von AlertDialog auf, der folgendermaßen aussieht:

protected AlertDialog(Context context) {
    this(context, com.Android.internal.R.style.Theme_Dialog_Alert);
}

In AlertDialog gibt es einen zweiten Konstruktor zum Ändern von Themen:

protected AlertDialog(Context context, int theme) {
    super(context, theme);
    [...]
}

dass der Builder einfach nicht aufruft.

Weitere relevante Fehlerbehebungen finden Sie im folgenden Beitrag.

Wie man das Thema für AlertDialog ändert

Das Folgende ist die am häufigsten gewählte Antwort:

  new AlertDialog.Builder(
  new ContextThemeWrapper(context, Android.R.style.Theme_Dialog))
64