【问题标题】:Call public method on main activity在主要活动上调用公共方法
【发布时间】:2011-11-11 10:58:37
【问题描述】:

我的主类有一个名为 commitChanges() 的公共方法。 我的布局包含扩展的 EditTexts,可以检测何时按下后退按钮,如下所示:Get back key event on EditText

现在,当检测到后退按钮按下时,我需要执行 commitChanges,它将内容存储到一个数组中。但是,commitChanges 需要访问活动的列表视图。

问题是:如何访问主Activity的commitChange函数?我将需要主要活动的实例。这是扩展EditText的代码:

    public class BackText extends EditText{

private static final String TAG = "baby";
public BackText(Context context) {
    super(context);

}

public BackText(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public BackText(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
}

@Override
public boolean onKeyPreIme(int keyCode, KeyEvent event) {
    if ((keyCode == KeyEvent.KEYCODE_BACK) && 
        event.getAction() == KeyEvent.ACTION_UP) {
            Log.d(TAG,"keypad exit");
            commitChange(this);
            return false;
    }
    return super.dispatchKeyEvent(event);
}

}

请注意,我是初学者,这对我来说非常先进。 注2:这与服务/多项活动无关。 BackTexts 放置在主活动中。

【问题讨论】:

    标签: android


    【解决方案1】:

    我会在您的活动中添加广播接收器,并从您的小部件代码中触发广播意图。我会避免小部件和您建议的活动之间的那种紧密耦合。

    【讨论】:

    • 对于这么简单的事情似乎付出了很多努力。另外:我的主类现在扩展了 ListActivity。我是否需要创建一个扩展 BroadcastReceiver 的子类来操作需要更新的数组?
    • 我会创建一个匿名成员对象来扩展 BroadcastReceiver。我同意这是一个很大的努力,但从一个小部件调用一个活动实例可能是一个糟糕的黑客攻击。我很想被证明不是这样:)
    【解决方案2】:

    我通过将以下子类添加到我的主要活动类来解决这个问题:

    class backReceiver extends BroadcastReceiver {
    
        @Override
        public void onReceive(Context context, Intent intent) {
            Log.d(TAG,"BACK received");
            BackText bt = (BackText)tlv.findViewWithTag(EDIT_TAG);
            bt.setTag(null);//only needed for id between caller/receiver
            commitChange(bt);
        }
    
    }
    

    并在主要活动的 oncreate 中添加以下内容:

    IntentFilter filter = new IntentFilter("com.commonsware.cwac.tlv.demo.commit");

    BroadcastReceiver receiver = new backReceiver();
    registerReceiver(receiver,filter);
    

    并将它添加到 BackText 一个 EditText 扩展:

    @Override
    public boolean onKeyPreIme(int keyCode, KeyEvent event) {
        if ((keyCode == KeyEvent.KEYCODE_BACK) && 
            event.getAction() == KeyEvent.ACTION_UP) {
                Log.d(TAG,"keypad exit");
                Intent intent = new Intent("com.ninovanhooff.babynames.commit");
                this.setTag("EDIT");
                getContext().sendBroadcast(intent);
                return false;
        }
        return super.dispatchKeyEvent(event);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-27
      • 1970-01-01
      • 1970-01-01
      • 2010-12-24
      • 2011-08-16
      • 2016-06-15
      • 1970-01-01
      相关资源
      最近更新 更多