如何在同一应用程序中跨钩子保持 Xposed 模块中的价值
How to keep value in Xposed module across hooks in same application
我正在开发一个用于在 EditTexts
中插入文本的 xposed 模块。用户应该能够使用音量up/down键点击不同的字符串。
到目前为止,我有模块 运行。我 hook 了 View
的 onFocusChanged
方法,然后检查 View
对象是否是 EditText
的实例。然后我将 OnKeyListener
设置为 EditText
。
因此,当我将焦点放在 EditText
字段中并继续单击 volumeDown 键 时,我希望该字段中出现不同的字符串。但我无法存储计数器值。我在我的 xposed class 中将其设为静态(我认为静态变量保存在应用程序中),但这也不起作用。
是否有存储(couter)值的方法?
我将能够检查文本字段中的文本,在我的文本数组中搜索相同的文本,确定当前索引并从那里开始工作,但我希望有一种 "nicer" 方式 :)
这是我的文本代码,index
变量是问题所在:
public class Xposed implements IXposedHookZygoteInit, IXposedHookLoadPackage {
private static int index, indexMax;
private static boolean first = true;
private static String[] valuesX = {"bla1", "bla2", "bla3", "bla4"};
private Context mCon;
private EditText et;
@Override
public void initZygote(StartupParam startupParam) throws Throwable {
findAndHookMethod(TextView.class, "onFocusChanged", boolean.class, int.class, Rect.class, new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
if (param.thisObject instanceof EditText) {
et = (EditText) param.thisObject;
if ((boolean) param.args[0]) {
et.setText("I have focus!!! (1)");
XposedBridge.log("starting quickinsert after focus");
mCon = et.getContext().getApplicationContext();
View.OnKeyListener okl = new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_DOWN) {
if ((keyCode == KeyEvent.KEYCODE_VOLUME_DOWN || keyCode == KeyEvent.KEYCODE_VOLUME_UP)) {
keyPressed(keyCode);
return true;
}
}
return false;
}
};;
et.setOnKeyListener(okl);
}
}
}
});
}
private void keyPressed(int keyCode) {
if ((keyCode == KeyEvent.KEYCODE_VOLUME_DOWN)) {
if (first) {
first = false;
} else {
if (index < indexMax) {
index++;
} else {
index = 0;
}
}
et.setText(valuesX[index]);
XposedBridge.log("keycode down consumed (index " + index + ")");
} else if ((keyCode == KeyEvent.KEYCODE_VOLUME_UP)) {
if (first) {
first = false;
} else {
if (index > 0) {
index--;
} else {
index = indexMax;
}
}
et.setText(valuesX[index]);
XposedBridge.log("keycode up consumed (index " + index + ")");
}
}
}
问题已解决...
一般解决方案:使变量静态以在相同的应用程序挂钩中访问它们
我的问题的解决方案:indexMax
未初始化。设置后 indexMax = valuesX.length;
一切正常
我正在开发一个用于在 EditTexts
中插入文本的 xposed 模块。用户应该能够使用音量up/down键点击不同的字符串。
到目前为止,我有模块 运行。我 hook 了 View
的 onFocusChanged
方法,然后检查 View
对象是否是 EditText
的实例。然后我将 OnKeyListener
设置为 EditText
。
因此,当我将焦点放在 EditText
字段中并继续单击 volumeDown 键 时,我希望该字段中出现不同的字符串。但我无法存储计数器值。我在我的 xposed class 中将其设为静态(我认为静态变量保存在应用程序中),但这也不起作用。
是否有存储(couter)值的方法? 我将能够检查文本字段中的文本,在我的文本数组中搜索相同的文本,确定当前索引并从那里开始工作,但我希望有一种 "nicer" 方式 :)
这是我的文本代码,index
变量是问题所在:
public class Xposed implements IXposedHookZygoteInit, IXposedHookLoadPackage {
private static int index, indexMax;
private static boolean first = true;
private static String[] valuesX = {"bla1", "bla2", "bla3", "bla4"};
private Context mCon;
private EditText et;
@Override
public void initZygote(StartupParam startupParam) throws Throwable {
findAndHookMethod(TextView.class, "onFocusChanged", boolean.class, int.class, Rect.class, new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
if (param.thisObject instanceof EditText) {
et = (EditText) param.thisObject;
if ((boolean) param.args[0]) {
et.setText("I have focus!!! (1)");
XposedBridge.log("starting quickinsert after focus");
mCon = et.getContext().getApplicationContext();
View.OnKeyListener okl = new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_DOWN) {
if ((keyCode == KeyEvent.KEYCODE_VOLUME_DOWN || keyCode == KeyEvent.KEYCODE_VOLUME_UP)) {
keyPressed(keyCode);
return true;
}
}
return false;
}
};;
et.setOnKeyListener(okl);
}
}
}
});
}
private void keyPressed(int keyCode) {
if ((keyCode == KeyEvent.KEYCODE_VOLUME_DOWN)) {
if (first) {
first = false;
} else {
if (index < indexMax) {
index++;
} else {
index = 0;
}
}
et.setText(valuesX[index]);
XposedBridge.log("keycode down consumed (index " + index + ")");
} else if ((keyCode == KeyEvent.KEYCODE_VOLUME_UP)) {
if (first) {
first = false;
} else {
if (index > 0) {
index--;
} else {
index = indexMax;
}
}
et.setText(valuesX[index]);
XposedBridge.log("keycode up consumed (index " + index + ")");
}
}
}
问题已解决...
一般解决方案:使变量静态以在相同的应用程序挂钩中访问它们
我的问题的解决方案:indexMax
未初始化。设置后 indexMax = valuesX.length;
一切正常