0

我有一个包含 classes.dex 的 apk。我没有apk源代码。我已经从 dex 文件(LoginActivity)加载了一个活动,并在 LoginActivity 中为 button1 实现了 onClicklistener。我成功加载 dex 文件并通过以下代码从 dex 文件开始活动:

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正在阻止从活动之外更改onClicklistener。这是正确的吗?任何帮助如何实现这一点?

4

1 回答 1

0

当您使用代码时:

Button mAddTaskButton = (Button) findViewById(R.id.button2)

这意味着您尝试在当前的 Activity 实例中查找视图(与 相同this.findViewById)-而不是从com.example.myapplication.ui.login.LoginActivity

我有两个想法可以解决您的问题:

  1. 使用 Application/Activity 方法registerActivityLifecycleCallbacks活动链接)。此回调具有onActivityCreated方法,该方法提供已创建活动的实例。在此方法中,您可以通过调用activity.getComponentName().getClassName()(链接到getComponentName方法和ComponentName 类描述)来获取 Activity 的名称。如果onActivityCreated方法提供的活动是,com.example.myapplication.ui.login.LoginActivity那么您可以像在代码片段中一样将 OnClickListene 添加到按钮(只需使用对活动的引用来获取按钮):
Button mAddTaskButton = (Button) activity.findViewById(R.id.button2);
mAddTaskButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                      ...
            }
        });

小心 ActivityLifecycleCallback 因为它附加到应用程序生命周期(不是活动)并且不要从回调中捕获活动的内容以避免内存链接。

  1. 另一种解决方案 - 您可以尝试创建名为 com.example.myapplication.ui.login.LoginActivity 的“存根”活动,然后将其扩展为 public class MyLoginActivity extends LoginActivity:然后你可以重写 MyLoginActivity 的 onCreate 方法并做你想做的事(我的意思是为按钮 onClick 监听器添加你的代码)。但是您不需要将此“存根”LoginActivity 构建到应用程序(apk)中,您应该将其添加为仅编译依赖项。我不知道如何处理一个类,但我知道其他解决方案:您可以将 LoginActivity 放在单独的模块或库(aar/jar)中,并将库(模块)作为compileOnly 依赖项添加到您的 gradle 文件如这里
于 2021-06-12T23:23:00.853 回答