使用相同的' OnClickListener'在不同的活动中

时间:2017-01-14 09:21:53

标签: java android android-fragments onclicklistener

在我目前使用的片段文件中定义并使用自定义OnClickListener (即MyOnClickListener)。

保持编写代码我意识到我在另一个片段中也需要相同的侦听器,恰好在另一个Activity 中。

因此我创建了文件MyOnClickListener.java复制我之前在第一个片段中使用的所有代码,但现在我收到以下错误:

  

无法解决方法' getActivity()'

     

无法解决方法' getResources()'

注意:我在 stackoverflow 上读到一个解决方案可能只是写MainActivity.this来代替getActivity(),但在我的情况下我需要在两个不同的活动。我该怎么办?

编辑:这是MyOnClickListener 的代码 它只需要显示一个图标矩阵:

class MyOnClickListener implements View.OnClickListener {

    private LabeledButton labeledButton;

    MyOnClickListener(LabeledButton labeledButton) {
    super();
    this.labeledButton = labeledButton;
}

@Override
public void onClick(View view) {
    Button iconButton = (Button) view;
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); // ERROR HERE
    LayoutInflater layoutInflater = getActivity().getLayoutInflater(); // ERROR HERE
    final View viewLayout = layoutInflater.inflate(R.layout.dialog_matrix_icons, null);
    builder.setView(viewLayout);
    builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int id) {
            // Do nothing
        }
    });
    final AlertDialog alertDialog = builder.create();

    // Set-up listeners of icon button
    Button imageButtons[][] = new Button[3][3];
    int i;
    int j;
    for (i = 0; i < 3; i++) {
        for (j = 0; j < 3; j++) {
            Resources res = getResources(); // ERROR HERE
            TypedArray icons = res.obtainTypedArray(R.array.listIcon);
            int idDrawable = icons.getResourceId(i + 3 * j, 1); // ERROR HERE
            icons.recycle();
            LinearLayout grid = (LinearLayout) viewLayout;
            LinearLayout row = (LinearLayout) grid.getChildAt(i);
            imageButtons[i][j] = (Button) row.getChildAt(j); // Retrieve the right image in the grid
            imageButtons[i][j].setBackgroundResource(idDrawable);
            String nameIcon = getResources().getResourceEntryName(idDrawable); // ERROR HERE
            ImageOnClickListener imageOnClickListener = new ImageOnClickListener(iconButton, alertDialog, idDrawable, nameIcon, labeledButton);
            imageButtons[i][j].setOnClickListener(imageOnClickListener);
        }
    }
    alertDialog.show();
}

}

2 个答案:

答案 0 :(得分:2)

将其替换为构造函数

@echo off
set "LogFile=%TEMP%\%~n0.tmp"
del "%LogFile%" 2>nul

>>"%LogFile%" echo test
rem Other commands with output also redirected to log file.

if exist "%LogFile%" (
    rem copy "%LogFile%" "%~dp0log.txt"
    copy /B "%~dp0log.txt"+"%LogFile%" "%~dp0log.txt"
    del "%LogFile%"
) >nul 2>&1
set "LogFile="

确保在MyOnClickListenerClass中创建上下文变量,否则您将在构造函数行中找到错误。然后您可以将所有MyOnClickListener(LabeledButton labeledButton,Context context) { super(); this.labeledButton = labeledButton; this.context = context; } 替换为getActivity()

初始化context时,请确保传递上下文参数

对于你的inflater使用这个

MyOnClickListener

答案 1 :(得分:0)

  

我在stackoverflow上读到一个解决方案可能只是写作   MainActivity.this代替getActivity(),但在我的情况下我   需要在两个不同的活动中使用相同的。我该怎么办?

如果将OnClickListener放在自己的编译统一中,则不能使用在Stackoverflow上读取的whawt MainActivity.this,指的是MainActivity的具体和当前实例(请查看关键字this在java中的含义)。如果您需要上下文,则可以使用onClick callaback View view中的参数来检索它。阅读更多here