Android:: Как изменить тему из других программ apk

У меня есть приложения с именем: preference, и я хочу создавать темы для этих приложений. Мой AndroidManifest.xml предпочтительнее:

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name="com.example.preference.MainActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>        
</application>

И в MainActivity.java: я получил кнопку изменения темы, нажав кнопку:

themeChange = (Button) findViewById(R.id.themeChange);
themeChange.setOnClickListener(this);

У меня есть приложение темы, которое имеет PinkTheme (styles.xml), а имя пакета - com.example.theme.

<resources xmlns:android="http://schemas.android.com/apk/res/android">
    <style name="AppBaseTheme" parent="android:Theme.Light">
        <!--
            Theme customizations available in newer API levels can go in
            res/values-vXX/styles.xml, while customizations related to
            backward-compatibility can go here.
        -->
    </style>
    <style name="PinkTheme" parent="AppBaseTheme" >
        <item name="android:textColor">#FF69B4</item>
        <item name="android:typeface">monospace</item>
        <item name="android:textSize">40sp</item>
        <item name="android:windowBackground">#008000</item>
    </style>
</resources>

И onClick() моего предпочтения:

public void onClick(View v) {
    // TODO Auto-generated method stub
    switch(v.getId()){

    case R.id.themeChange:          
      Resources res = null;
      try {
          res = getPackageManager().getResourcesForApplication("com.example.theme");
      } catch (NameNotFoundException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
      }
      if(null != res) {
        int sId = res.getIdentifier("com.example.theme:style/PinkTheme", null, null);
        Theme themeObject = res.newTheme();  // theme object
        themeObject.applyStyle(sId, true);  // Place new attribute values into the theme
        getTheme().setTo(themeObject);
      }
        break;

    default:
        break;

    }
}

Я получил тему Object пакета темы и попробую setTheme приложения предпочтения. Но это не работает. Пожалуйста, помогите мне в этом: как программно настроить тему из других приложений на мое текущее приложение.

Ответ 1

Если вы хотите изменить настройки в одном приложении от другого, то, вероятно, самый простой способ сделать это - установить идентификатор темы в намерение и отправить это намерение в свою MainActivity (или в IntentService), где приложение-получатель может обрабатывать данные. Например, когда намерение приходит, вы можете обрабатывать его, как вы делаете событие click в логике "onClick".

Например, приложение может создать такое намерение:

    Intent intent = new Intent("android.intent.action.MAIN");
    intent.setComponent(new ComponentName("your.package", "your.package.component"));
    intent.putExtra("theme_id", "theme_1");
    startActivity(intent);

Затем в вашей деятельности используйте getIntent().getStringExtra("theme_id"), чтобы получить данные, переданные вашему приложению.

Ответ 2

Вам нужно будет использовать ресурсы приложения для загрузки темы. Я ответил на это в другой теме: fooobar.com/info/548518/...

Вот пример, где установлен пакет "com.example.theme", и мы используем ресурсы приложений и стиль темы в другом приложении:

public class MainActivity extends AppCompatActivity {

  Resources resources;

  @Override protected void onCreate(Bundle savedInstanceState) {

    int themeResId = getResources().getIdentifier("AppTheme", "style", "com.example.theme");
    if (themeResId != 0) {
      setTheme(themeResId);
    }

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
  }

  @Override public Resources getResources() {
    if (resources == null) {
      try {
        resources = getPackageManager().getResourcesForApplication("com.example.theme");
      } catch (PackageManager.NameNotFoundException e) {
        resources = super.getResources();
      }
    }
    return resources;
  }

}

Смотрите здесь для рабочего проекта на GitHub.


Это может привести к проблемам, поскольку все макеты, чертежи, строки и т.д. будут загружены из других ресурсов приложения. Поэтому вам следует избегать использования темы из другого пакета и вместо этого копировать ресурсы и тему в свой собственный проект.