如何在 android 中更改 activity 外的按钮点击监听器?
How change button clicklistener outside activity in android?
我有一个包含 classes.dex 的 apk。我没有apk源代码。我已经从 dex 文件 (LoginActivity) 加载了一个 activity 并在 LoginActivity 中为 button1 实现了 onClicklistener。我成功加载了 dex 文件并通过以下代码从 dex 文件启动 activity:
DexClassLoader dex = new DexClassLoader(dexInternalStoragePath.getAbsolutePath(), mAppContext.getCacheDir().getPath(), null, loader);
toasterClass = dex.loadClass("com.example.myapplication.ui.login.LoginActivity");
Intent intent = new Intent();
intent.setClass(getApplicationContext(),toasterClass);
setContentView(View.inflate(getApplicationContext(), R.layout.activity_login, null));
Button mAddTaskButton = (Button) findViewById(R.id.button2);
mAddTaskButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AlertDialog aldlg = new AlertDialog.Builder(gLoginActivity.this).create();
aldlg.setTitle("Login");
aldlg.setMessage("You pressed Login Button");
aldlg.setButton(AlertDialog.BUTTON_NEUTRAL, "OK",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
aldlg.show();
}
});
startActivity(intent);
但是当我点击 button2 时,它没有显示 alertdialog。我认为 android 阻止在 activity 之外更改 onClicklistener。这是对的吗?
对如何实现这个有帮助吗?
当您使用代码时:
Button mAddTaskButton = (Button) findViewById(R.id.button2)
这意味着您尝试在当前 Activity 实例中查找视图(与 this.findViewById
相同)- 而不是从 com.example.myapplication.ui.login.LoginActivity
我有两个想法来解决你的问题:
- 使用 Application/Activity 方法 registerActivityLifecycleCallbacks (link for activity ). This callback has method onActivityCreated which provides instance of created activity. In this method you can get Activity's name by calling to
activity.getComponentName().getClassName()
(link to getComponentName method and to ComponentName class description)。如果 onActivityCreated
方法提供的 activity 是 com.example.myapplication.ui.login.LoginActivity
那么您可以将 OnClickListene 添加到代码片段中的按钮(只需使用对 activity 的引用来获取按钮):
Button mAddTaskButton = (Button) activity.findViewById(R.id.button2);
mAddTaskButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
...
}
});
小心使用 ActivityLifecycleCallback,因为它附加到应用程序生命周期(而不是 activity)并且不要从回调中捕获 Activity 的内容以避免内存链接。
- 另一种解决方案 - 您可以尝试创建名称为 com.example.myapplication.ui.login.LoginActivity 的“存根”activity,然后将其扩展为:
public class MyLoginActivity extends LoginActivity
。然后您可以覆盖 MyLoginActivity 的 onCreate 方法并执行您想要的操作(我的意思是为按钮 onClick 侦听器添加代码)。但是您不需要将此“存根”LoginActivity 构建到应用程序 (apk) 中,您应该将其添加为仅编译依赖项。我不知道如何使用 class 但我知道其他解决方案:您可以将 LoginActivity 放入单独的模块或库(aar/jar)并将库(模块)添加为 compileOnly dependency to your gradle file (like here)
我有一个包含 classes.dex 的 apk。我没有apk源代码。我已经从 dex 文件 (LoginActivity) 加载了一个 activity 并在 LoginActivity 中为 button1 实现了 onClicklistener。我成功加载了 dex 文件并通过以下代码从 dex 文件启动 activity:
DexClassLoader dex = new DexClassLoader(dexInternalStoragePath.getAbsolutePath(), mAppContext.getCacheDir().getPath(), null, loader);
toasterClass = dex.loadClass("com.example.myapplication.ui.login.LoginActivity");
Intent intent = new Intent();
intent.setClass(getApplicationContext(),toasterClass);
setContentView(View.inflate(getApplicationContext(), R.layout.activity_login, null));
Button mAddTaskButton = (Button) findViewById(R.id.button2);
mAddTaskButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AlertDialog aldlg = new AlertDialog.Builder(gLoginActivity.this).create();
aldlg.setTitle("Login");
aldlg.setMessage("You pressed Login Button");
aldlg.setButton(AlertDialog.BUTTON_NEUTRAL, "OK",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
aldlg.show();
}
});
startActivity(intent);
但是当我点击 button2 时,它没有显示 alertdialog。我认为 android 阻止在 activity 之外更改 onClicklistener。这是对的吗? 对如何实现这个有帮助吗?
当您使用代码时:
Button mAddTaskButton = (Button) findViewById(R.id.button2)
这意味着您尝试在当前 Activity 实例中查找视图(与 this.findViewById
相同)- 而不是从 com.example.myapplication.ui.login.LoginActivity
我有两个想法来解决你的问题:
- 使用 Application/Activity 方法 registerActivityLifecycleCallbacks (link for activity ). This callback has method onActivityCreated which provides instance of created activity. In this method you can get Activity's name by calling to
activity.getComponentName().getClassName()
(link to getComponentName method and to ComponentName class description)。如果onActivityCreated
方法提供的 activity 是com.example.myapplication.ui.login.LoginActivity
那么您可以将 OnClickListene 添加到代码片段中的按钮(只需使用对 activity 的引用来获取按钮):
Button mAddTaskButton = (Button) activity.findViewById(R.id.button2);
mAddTaskButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
...
}
});
小心使用 ActivityLifecycleCallback,因为它附加到应用程序生命周期(而不是 activity)并且不要从回调中捕获 Activity 的内容以避免内存链接。
- 另一种解决方案 - 您可以尝试创建名称为 com.example.myapplication.ui.login.LoginActivity 的“存根”activity,然后将其扩展为:
public class MyLoginActivity extends LoginActivity
。然后您可以覆盖 MyLoginActivity 的 onCreate 方法并执行您想要的操作(我的意思是为按钮 onClick 侦听器添加代码)。但是您不需要将此“存根”LoginActivity 构建到应用程序 (apk) 中,您应该将其添加为仅编译依赖项。我不知道如何使用 class 但我知道其他解决方案:您可以将 LoginActivity 放入单独的模块或库(aar/jar)并将库(模块)添加为 compileOnly dependency to your gradle file (like here)