如何从内部类返回值?

时间:2011-11-29 00:04:16

标签: java android

我的代码在这里:

public static boolean showConfirmationDialog(Context context, String title, String dialogContent) {
        AlertDialog.Builder builder = new AlertDialog.Builder(context);
        builder.setIcon(android.R.drawable.ic_dialog_alert);
        builder.setTitle(title);
        builder.setMessage(dialogContent);
        builder.setPositiveButton("Confirm", new OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {
                // what to do ?
            }
        });

现在,我想在点击"确认"之后返回true。按钮。那么我该如何回归" true"来自内部类 - 方法的OnClickListener。

需要一些帮助,谢谢。

5 个答案:

答案 0 :(得分:10)

在此实例中,您无法从内部类返回内容。在这种情况下,它没有多大意义。该程序应该在你的onClick函数内等待,直到它返回一些东西?这并不是听众的工作方式。如果返回“true”,你需要做的就是执行你计划执行的任何代码,并把它放在你的内部类中。

答案 1 :(得分:3)

OnClickListeners不返回值。在点击监听器触发时我不知道你需要做什么,我不能给你任何细节,但是

private boolean classBoolean = false;
public static boolean showConfirmationDialog(Context context, String title, String    dialogContent) {

    //local variables must be declared final to access in an inner anonymous class
    final boolean localBoolean = false;

    AlertDialog.Builder builder = new AlertDialog.Builder(context);
    builder.setIcon(android.R.drawable.ic_dialog_alert);
    builder.setTitle(title);
    builder.setMessage(dialogContent);
    builder.setPositiveButton("Confirm", new OnClickListener() {

        @Override
        public void onClick(DialogInterface dialog, int which) {
            // what to do ?
            //you can't change a local var since to access it it needs to be final
            //localBoolean = true; can't do this
            //so you can change a class var
            classBoolean = true;
            //or you can also call some method to do something
            someMethod();
        }
    });

答案 2 :(得分:2)

您需要在实例变量上设置返回值(不在方法中) - 但这可能会导致并发问题,或者使用“容器”对象。传入或使用“最终”方法变量,您可以在其上设置要返回的返回值。但是,我松散地使用术语“返回”,至少在您的示例中,此代码不会立即执行,因此您确实需要在内部类中进行您感兴趣的处理。

答案 3 :(得分:0)

onClick范式不允许您返回值,而让您稍后响应“事件”,因此您必须重新考虑一下代码范式。

对于追随者,如果内部类“阻塞”(即不是这种情况),则可以使用AtomicReference返回值,例如:

AtomicReference<String> returnValue = new AtomicReference<>();
someMethod( new Runnable() { returnValue.set("my inner class value");} );
return returnValue.get();

(如果可能的话)更好的方法是修改someMethod,以便它可以将您的值自身返回(并在此实例中使用Runnable以外的值)。 GL!

答案 4 :(得分:0)

您可以按照以下简单步骤操作:

 create a POJO class object inside method.
 call setter method by setting return value and use it.

示例:

    public void process(){
    Contact contact=new Contact();
    String selectCount="select * from firmId  where id=? for update";
   PreparedStatementCreatorFactory pscf = new 
   PreparedStatementCreatorFactory(selectCount,new int[] {Types.INTEGER});
        pscf.setUpdatableResults(true);
        pscf.setResultSetType(ResultSet.CONCUR_UPDATABLE);
        RowCallbackHandler rch = new RowCallbackHandler() {
            @Override
            public void processRow(ResultSet resultSet) throws SQLException {

             // Here You can set your value
                contact.setContactId(incrementCount);
                resultSet.updateLong("firmCount",incrementCount);
                resultSet.updateRow();
                return;                                                                        
            }
          };
         return contact.getId();
       }