`
panxq0809
  • 浏览: 296616 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

为何GoogleSearch中可以嵌入EditText?

阅读更多

原文出自:http://www.eoeandroid.com/viewthread.php?tid=1729

eoeandroid社区是国内最火的android社区。

最近在学习AppWidget,想做一个像GoogleSearch那样带有输入框的Widget练习。

可是,Dev Guide关于AppWidget的讲解明确指出,在App Widget中只能用FrameLayout,LinearLayout,RelativeLayout三种Layout和AnalogClock,Button,Chronometer,ImageButton,ImageView,ProgressBar,TextView这几种Widget,而且它们的子类也不能用。

不管怎样还是用先用EditText看看。编译和安装都没有问题。但是在向桌面加入AppWidget的时候,就会出现“Problem loading widget”错误。

看来真的只能用TextView了。

虽然通过修改TextView的属性,可以让TextView看起来象EditText,而且也可以输入,但是至少有两个问题:

1.光标不能在文本框内移动 -
按左右箭头时,焦点会跳到其它的Item上,而不是像EditText那样在字符间移动。看了一下EditText是通过Override TextView的getDefaultMovementMethod这个方法设置箭头按键的移动方式的。而TextView中虽然也有setMovementMethod方法,但是搞了半天也没办法从RemoteViews中拿到TextView的实例;

2.这一点比较重要:不知道该如何从RemoteViews中获得TextView的输入的结果?

可是GoogleSearch上明明就有输入框。它是怎么实现的呢?

在网上查了一下,结论是:GoogleSearch并不是用普通AppWidget方法实现的Widget,而是在Home(Launcher)中独立实现,是属于Launcher的一部分。

翻出Launcher的代码(/packages/apps/Launcher),果然看到了GoogleSearch的实现在Search.java,它的Layout定义在widget_search.xml。其中的输入框是Launcher封装了的AutoCompleteTextView(即SearchAutoCompleteTextView)。

那么Launcher是怎样区别加载GoogleSearch和其它普通的AppWidget的呢?

在Launcher中有一个static成员LauncherModel,它主要负责维护Launcher的状态和提供一些更新Launcher数据库状态的API。LaunchModel中用不同的ArrayList记录ItemInfo和LauncherAppWidgetInfo的信息(ITEM_TYPE_APPLICATION, ITEM_TYPE_USER_FOLDER, ITEM_TYPE_LIVE_FOLDER, ITEM_TYPE_WIDGET_SEARCH这些类型的Item都被记录在ItemInfo类型中)。

具体的加载过程大概是:在Launcher的onCreate和onResume中都调用了LauncherModel::loadUserItems方法。之后的顺序是LauncherModel::loadUserItems->Launcher::onDesktopItemsLoaded->Launcher::bindDesktopItems->…->最后在Launcher::DesktopBinder::handleMessage中通过Launcher::bindItems方法加载了Widget Search到workspace(控制桌面显示区域的class)上,而通过Launcher::bindAppWidgets加载了普通的AppWidgets。

再看一下Widget添加的过程吧。Launcher通过addSearch直接用inflate的方法产生一个GoogleSearchWidget的View,并添加到workspace;而普通的AppWidget则是通过completeAddAppWidget中产生并添加一个AppWidgetHostView来实现的。

分享到:
评论

相关推荐

    EditTextSearch

    而“EditTextSearch”这个主题则涉及到如何实时监控`EditText`中的输入内容,并根据这些输入进行数据的搜索和筛选操作。这一过程对于实现用户友好的搜索功能至关重要,尤其是在大数据集的应用场景下,比如在线购物...

    ListView嵌入EditText焦点和滑动值错位问题解决

    然而,当我们在ListView中嵌入EditText时,可能会遇到一些常见的问题,比如EditText无法获取焦点,以及用户在EditText中输入内容后,随着ListView的滚动,EditText的输入值会出现错位现象。这些问题严重影响了用户...

    Android限制只能输入中文的EditText

    如果输入的不是中文字符,我们可以在`onTextChanged()`方法中清空EditText的内容,或者显示一个提示信息告知用户只能输入中文。这样,当用户尝试输入非中文字符时,系统会自动将其过滤掉。 6. **代码示例**: 在...

    Android完美解决listview中多个edittext显示混乱问题

    - 另外,可以为EditText添加一个OnFocusChangeListener,当EditText获得焦点时,记录其位置并阻止ListView滚动;失去焦点时,更新ListView的数据并允许滚动。 5. **解决方案四:使用ExpandableListView替代...

    ListView中的EditText

    最后,为了获取ListView中所有EditText的值,可以在适配器中添加一个方法,遍历HashMap并返回所有值: ```java public List<String> getAllEditTextValues() { List<String> values = new ArrayList(editorValue....

    android 中如何限制 EditText 最大输入字符数

    限制 EditText 最大输入字符数可以通过三种方法实现:在 xml 文件中设置文本编辑框属性、在代码中使用 InputFilter 进行过滤、利用 TextWatcher 进行监听。开发者可以根据实际情况选择适合的方法。

    Android2.2 API中文文档 —EditText

    在XML布局文件中,我们可以使用`<EditText>`标签来创建一个文本输入框。例如: ```xml <EditText android:id="@+id/edit_text" android:layout_width="match_parent" android:layout_height="wrap_content" ...

    安卓自定义ListView中含有EditText控件

    首先,我们需要理解为什么在ListView中直接使用EditText会存在问题。ListView的工作原理是基于视图复用,也就是View Holder模式。当用户滚动ListView时,已超出屏幕范围的视图会被回收并重新用来显示即将进入视野的...

    Listview与EditText

    "Listview与EditText"的主题主要关注如何在ListView的子项中嵌入EditText,同时确保用户输入的数据能够正确保存,并在EditText失去焦点时仍能保持其状态。 问题的核心在于ListView的复用机制。ListView为了提高性能...

    Android中EditText密码样式设置

    在XML布局文件中,我们可以使用`<EditText>`标签来创建一个`EditText`实例。要将其设置为密码样式,我们需要设置`inputType`属性,如下所示: ```xml <EditText android:id="@+id/et_password" android:layout_...

    scrollview 中嵌套 edittext

    此外,还可以考虑使用`NestedScrollView`替代传统的ScrollView,NestedScrollView是专门为嵌套滑动设计的,它可以更好地处理与子视图(如EditText)的滚动交互。只需简单地替换布局文件中的ScrollView即可: ```xml...

    EditText限制输入中文或英文字数

    我们可以使用`TextWatcher`监听`EditText`中的文本变化,然后在`afterTextChanged()`方法中进行字数检查。首先,我们需要创建一个`TextWatcher`实例,并重写其相关方法: ```java TextWatcher textWatcher = new ...

    android listview中有edittext的demo

    当我们在ListView中需要实现用户可编辑的输入功能时,通常会在每个列表项中嵌入一个EditText。本示例"android listview中有edittext的demo"就是针对这种场景进行的实践。以下是关于这个主题的详细知识点: 1. **...

    Listview中的EditText数值的存储

    在这个游戏中,EditText被嵌入到ListView的每个条目中,让用户可以直接在ListView中修改每个条目的数值。 3. **自定义Adapter**: - 由于ListView默认不支持EditText,所以需要自定义一个Adapter,继承自...

    EditText焦点的自动跳转

    5. **XML布局中的焦点转移**:在布局文件中,我们也可以使用`android:nextFocusDown`属性来指定当当前`EditText`失去焦点时,焦点应移动到哪个`EditText`。例如: ```xml <EditText android:id="@+id/editText1" ...

    listView中嵌套EditText,动态获取EditText中的值

    现在,ListView中的每一项都有一个EditText,用户可以输入内容。通过适配器中的TextWatcher,我们可以在文本发生变化时实时更新数据列表。要获取所有EditText的值,可以直接遍历`dataList`。 最后,为了确保在滚动...

    ListView 解决EditText冲突

    然而,当在ListView的每个条目(Item)中嵌入EditText时,可能会遇到一个问题:用户在EditText中输入数据后,如果上下滚动ListView,之前输入的数据可能会显示在其他条目上,造成数据错乱。这个问题被称为“ListView...

    Edittext限制字符数,可以限制最大和最小。

    标题和描述中提到的“Edittext限制字符数,可以限制最大和最小”就是这样一个功能,它允许我们设置`EditText`可以接受的最大字符数(maxLength)和最小字符数(minLength)。接下来,我们将详细探讨如何实现这一功能...

    Android中ListView多个Edittext获取输入内容.rar

    通过这样的方式,我们不仅可以确保在ListView中多个EditText的输入内容被正确地管理,还可以优化用户体验,避免因ListView滚动导致的数据混乱。在实际开发中,这样的技巧对于处理复杂的列表形式交互是至关重要的。

    android listview带有editText

    然而,当在ListView的每一项中嵌套EditText时,会遇到一些挑战,主要包括EditText的焦点管理问题和数据错位问题。这两个问题在实际应用中是开发者经常需要解决的关键点。 首先,我们来看EditText的焦点问题。当用户...

Global site tag (gtag.js) - Google Analytics