【问题标题】:Is casting Child to Parent fine?将 Child 转换为 Parent 可以吗?
【发布时间】:2014-07-30 11:46:13
【问题描述】:

我的 Android 项目中有以下代码:

// The OnTouchListener is used so we are able to trigger the OnItemClickListener of the ListView,
// even though an EditText or AutoCompleteTextView is focused
private OnTouchListener itemOnTouchListener = new OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if(v instanceof EditText){
            EditText et = (EditText)v;
            et.setFocusable(true);
            et.setFocusableInTouchMode(true);
        }
        else{
            MyHolder h = (MyHolder) v.getTag();
            h.etAmount.setFocusable(false);
            h.etAmount.setFocusableInTouchMode(false);
            h.actvName.setFocusable(false);
            h.actvName.setFocusableInTouchMode(false);
        }
        return false;
    }
};

视图可以是:

  • EditText
  • AutoCompleteTextView
  • 其他一些视图元素

我已经调试了代码,因为AutoCompleteTextView's parent 是EditText,所以代码也进入了这个if。

所以我的问题是:在 AutoCompleteTextView 上使用EditText et = (EditText)v; 来设置其setFocusablesetFocusableInTouchMode 是否安全?还是我应该改为以下?

// The OnTouchListener is used so we are able to trigger the OnItemClickListener of the ListView,
// even though an EditText or AutoCompleteTextView is focused
private OnTouchListener itemOnTouchListener = new OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        // WARNING: Leave this if above the if else for EditText,
        // since AutoCompleteTextView has EditText as parent
        if(v instanceof AutoCompleteTextView){
            AutoCompleteTextView actv = (AutoCompleteTextView)v;
            actv.setFocusable(true);
            actv.setFocusableInTouchMode(true);
        }
        else if(v instanceof EditText){
            EditText et = (EditText)v;
            et.setFocusable(true);
            et.setFocusableInTouchMode(true);
        }
        else{
            MyHolder h = (MyHolder) v.getTag();
            h.etAmount.setFocusable(false);
            h.etAmount.setFocusableInTouchMode(false);
            h.actvName.setFocusable(false);
            h.actvName.setFocusableInTouchMode(false);
        }
        return false;
    }
};

【问题讨论】:

  • 没关系。这就是多态的用途。

标签: java android casting parent-child instanceof


【解决方案1】:

是的。您可以将 Child 转换为 Parent,因为每个 Child 都是 Parent。这就是 OOP 的美妙之处。

【讨论】:

  • 好的,我想是的,但不确定。谢谢。我将在 10 分钟内接受答案,因为在创建问题之后我还不能接受。 ;) 看起来我的 AutoCompleteTextView 目前无法聚焦的问题在于其他地方,所以我会调查这个问题,并在必要时创建一个新问题。
猜你喜欢
  • 2018-01-02
  • 2019-05-13
  • 1970-01-01
  • 2015-10-14
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
相关资源
最近更新 更多