Ваш класс должен реализовывать интерфейс Preference.OnPreferenceChangedListener
и быть установленным в качестве вашего прослушивателя изменений ListPreference
. Вашему методу слушателя будет передано новое значение в качестве параметра, после чего вы можете передать это в свой метод execRootCmdSilent
.
Критический smali секция по направлению к нижней части ниже файлов:
.method public onPreferenceChange(Landroid/preference/Preference;Ljava/lang/Object;)Z
move-object v2, p2
// there are some more moves here and a test, which is why we're shuffling registers
move-object v3, v2
invoke-virtual {v3}, Ljava/lang/Object;->toString()Ljava/lang/String;
move-result-object v3
invoke-static {v3}, Lsarbs/com/tinker/SettingsActivity;->execRootCmdSilent(Ljava/lang/String;)I
В основном, значение p2
является вторым параметром передается в onPreferenceChange
метода (newValue
). Мы переместим это в локальный регистр, а затем invoke-virtual
на него toString
. Переместите результат этого вызова в регистр v3
, а затем вы можете invoke-static
использовать ваш метод execRootCmdSilent
, используя этот параметр v3
в качестве параметра.
код Java я использовал для реализации этого:
package sarbs.com.tinker;
import android.os.Bundle;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.PreferenceActivity;
public class SettingsActivity extends PreferenceActivity implements Preference.OnPreferenceChangeListener {
ListPreference mListPreference;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.pref_general);
mListPreference = (ListPreference) findPreference("dp_cleaner");
mListPreference.setOnPreferenceChangeListener(this);
}
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
if (preference == mListPreference) {
execRootCmdSilent(newValue.toString());
}
return true;
}
public static int execRootCmdSilent(String str) {
return 0;
}
}
И smali код было произведено:
.class public Lsarbs/com/tinker/SettingsActivity;
.super Landroid/preference/PreferenceActivity;
.source "SettingsActivity.java"
# interfaces
.implements Landroid/preference/Preference$OnPreferenceChangeListener;
# instance fields
.field mListPreference:Landroid/preference/ListPreference;
# direct methods
.method public constructor <init>()V
.registers 3
.prologue
.line 8
move-object v0, p0
.local v0, "this":Lsarbs/com/tinker/SettingsActivity;
move-object v1, v0
invoke-direct {v1}, Landroid/preference/PreferenceActivity;-><init>()V
return-void
.end method
.method public static execRootCmdSilent(Ljava/lang/String;)I
.registers 3
.prologue
.line 30
move-object v0, p0
.local v0, "str":Ljava/lang/String;
const/4 v1, 0x0
move v0, v1
.end local v0 # "str":Ljava/lang/String;
return v0
.end method
# virtual methods
.method protected onCreate(Landroid/os/Bundle;)V
.registers 7
.prologue
.line 13
move-object v0, p0
.local v0, "this":Lsarbs/com/tinker/SettingsActivity;
move-object v1, p1
.local v1, "savedInstanceState":Landroid/os/Bundle;
move-object v2, v0
move-object v3, v1
invoke-super {v2, v3}, Landroid/preference/PreferenceActivity;->onCreate(Landroid/os/Bundle;)V
.line 15
move-object v2, v0
const v3, 0x7f030001
invoke-virtual {v2, v3}, Lsarbs/com/tinker/SettingsActivity;->addPreferencesFromResource(I)V
.line 17
move-object v2, v0
move-object v3, v0
const-string v4, "dp_cleaner"
invoke-virtual {v3, v4}, Lsarbs/com/tinker/SettingsActivity;->findPreference(Ljava/lang/CharSequence;)Landroid/preference/Preference;
move-result-object v3
check-cast v3, Landroid/preference/ListPreference;
iput-object v3, v2, Lsarbs/com/tinker/SettingsActivity;->mListPreference:Landroid/preference/ListPreference;
.line 18
move-object v2, v0
iget-object v2, v2, Lsarbs/com/tinker/SettingsActivity;->mListPreference:Landroid/preference/ListPreference;
move-object v3, v0
invoke-virtual {v2, v3}, Landroid/preference/ListPreference;->setOnPreferenceChangeListener(Landroid/preference/Preference$OnPreferenceChangeListener;)V
.line 19
return-void
.end method
.method public onPreferenceChange(Landroid/preference/Preference;Ljava/lang/Object;)Z
.registers 8
.prologue
.line 23
move-object v0, p0
.local v0, "this":Lsarbs/com/tinker/SettingsActivity;
move-object v1, p1
.local v1, "preference":Landroid/preference/Preference;
move-object v2, p2
.local v2, "newValue":Ljava/lang/Object;
move-object v3, v1
move-object v4, v0
iget-object v4, v4, Lsarbs/com/tinker/SettingsActivity;->mListPreference:Landroid/preference/ListPreference;
if-ne v3, v4, :cond_12
.line 24
move-object v3, v2
invoke-virtual {v3}, Ljava/lang/Object;->toString()Ljava/lang/String;
move-result-object v3
invoke-static {v3}, Lsarbs/com/tinker/SettingsActivity;->execRootCmdSilent(Ljava/lang/String;)I
move-result v3
.line 26
:cond_12
const/4 v3, 0x1
move v0, v3
.end local v0 # "this":Lsarbs/com/tinker/SettingsActivity;
return v0
.end method
как бы я найти 'mListPreference = (ListPreference) findPreference ("dp_cleaner"); 'на основе того, что используется? – Kevin
Я не понимаю вашего вопроса. Строка, которую вы цитируете, просто сохраняет ListPreference, чтобы вы могли убедиться, что ваш обратный вызов 'onPreferenceChanged' сообщает вам об обновлении для правильного предпочтения. Новое значение передается вам в вызове 'onPreferenceChanged', как второй параметр. – tophyr