当前位置:  编程技术>移动开发
本页文章导读:
    ▪施用TextWatcher监听EditText的文本变化之后动态改变EditText里面的内容        使用TextWatcher监听EditText的文本变化之后动态改变EditText里面的内容  今天碰到一个这样的问题:使用TextWatcher对EditText进行监听,当EditText中值为某一特定内容时,将EditText中的值设为我们需要.........
    ▪ 不成功Apple使用的经验教训总结——App Store创赢艺术        不成功Apple应用的经验教训总结——App Store创赢艺术 你现在已经了解了如何分析并找到成功的应用,可是,从不成功的应用中又能学到些什么好处,又应该如何去寻找它们呢? 让我们首先仔.........
    ▪ BB10 Cascades: 旋钮组件的使用       BB10 Cascades: 按钮组件的使用 在BB10 Cascades的QML中提供了按钮组件,也就是Button组件,通过它可以为用户提供一个操作按钮。对于简单的界面操作,可以在QML中直接为按钮编写javascript代码,通.........

[1]施用TextWatcher监听EditText的文本变化之后动态改变EditText里面的内容
    来源: 互联网  发布时间: 2014-02-18
使用TextWatcher监听EditText的文本变化之后动态改变EditText里面的内容

  今天碰到一个这样的问题:使用TextWatcher对EditText进行监听,当EditText中值为某一特定内容时,将EditText中的值设为我们需要的那个值。一开始就是简单的在EditText中使用setText(...)来实现,结果出现栈溢出的异常。这里提供一个:当判断条件满足时,在afterTextChanged()方法中将TextWatcher移除掉,然后设置EditText的值,接着把TextWatcher重新设置进去。就是这么简单,这里我们判断如果EditText中的值为111,就将EditText的值设置为11111new。先看效果图,再看代码。

效果图:


代码:

EditText editText;
	MyTextWathcer myTextWathcer;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        editText = (EditText) findViewById(R.id.editText);
        myTextWathcer = new MyTextWathcer();
        editText.addTextChangedListener(myTextWathcer);
    }
    
    private class MyTextWathcer implements TextWatcher{

		@Override
		public void beforeTextChanged(CharSequence s, int start, int count,
				int after) {
			
		}

		@Override
		public void onTextChanged(CharSequence s, int start, int before,
				int count) {
			
		}

		@Override
		public void afterTextChanged(Editable s) {
			int i = 0;
			try {
				i = Integer.valueOf(s.toString());
			} catch (Exception e) {
				e.printStackTrace();
			}
			if(i == 111){
				editText.removeTextChangedListener(this);
				setMyText();
			}
		}
    }
    
    private void setMyText(){
    	editText.setText("11111new");
    	editText.addTextChangedListener(myTextWathcer);
    }
  可能很多童鞋会奇怪,为什么在自己类的方法中将自己移除不会出错?我们去TextView类的removeTextChangedListener()方法中看一下大概就会明白了。该方法如下:

/**
     * Removes the specified TextWatcher from the list of those whose
     * methods are called
     * whenever this TextView's text changes.
     */
    public void removeTextChangedListener(TextWatcher watcher) {
        if (mListeners != null) {
            int i = mListeners.indexOf(watcher);

            if (i >= 0) {
                mListeners.remove(i);
            }
        }
    }

文档已经说的很清楚了,该方法仅仅是将当前的TextWatcher从集合中移除。我们可以理解成该TextWatcher对象暂时未被回收,所以在不进行耗时操作的情况下,该是可行的,不知道还有没有更好的方式,如果有朋友有更好的方式,可以拿出来一起分享。



    
[2] 不成功Apple使用的经验教训总结——App Store创赢艺术
    来源: 互联网  发布时间: 2014-02-18
不成功Apple应用的经验教训总结——App Store创赢艺术

你现在已经了解了如何分析并找到成功的应用,可是,从不成功的应用中又能学到些什么好处,又应该如何去寻找它们呢?

让我们首先仔细分析一下,什么样的应用并不是不成功的,从而对于“不成功”的定义有一个共识。就像“成功的”应用并不意味着就一定是个优秀的应用一样,一款不成功的应用也并不意味着就一定是糟糕的应用。如果你在各种应用中略微发掘一下,就能找到许多非常棒的应用,虽然有着一流的评价,但是,出于这样或那样的原因(与推广和市场营销有关),却并不畅销。另一方面,你也可以找到许多成功的应用和游戏,但用户对它们的评价却都只是中等程度而已。

在游戏业界,比较出名的例子就是2003年的那款官方授权的PC游戏“黑客帝国”(Enter the Matrix),该作品源自于家喻户晓的电影“黑客帝国”(The Matrix,参见图1)。这款游戏在市场营销上耗费了数百万美元,尽管有不少尖锐的批评和玩家的负面评论,但确实在首月取得了卓越的销售成绩。虽然这款游戏在短期内的销量都保持着坚挺,在后来恶评如潮之前就已经为开发者赚取了大笔金钱,但是,如今的时代已经不同了。

图1 “黑客帝国”,这款在许多评测中都最多称得上是平庸之作,却大卖特卖,很大程度上是因为初期的市场炒作

只要市场营销成本投入够大,一款销量很高的零售游戏(即便品质只能算是中等,甚至更差)也依然有可能通过炒作销售(hype-to-sell)的方法取得侥幸的成功。我们来看看PC上的大型多人在线游戏(MMO)“星球大战:旧共和国”(Star Wars: The Old Republic),以及在过去的几年里,这款游戏在推广上耗费了多少钱财。它在2010年和2011年播出了长达数分钟的纯电影预告片,投入了至少几百万美元。也许,在你阅读本书的时候,就可以对这样的烧钱行为是否成功下定论了。

另一方面,对应用而言,尽管炒作和推广依然非常重要,但要想通过炒作销售的方法侥幸成功已是难上加难。从这一角度来看,零售MMO游戏和应用有许多共同点。停留力(Retention,也就是能够将用户吸引过来)依然在很大程度上要么取决于其品质,要么取决于应用环境的竞争激烈程度,这和MMO游戏是一样的。那些没有持续订购功能和新内容的一次性游戏也许能够收回最初的开销,但是MMO游戏和iPhone应用必须持续销售下去,才能兴旺发达。

App Store中还存在着更进一步的风险因素。由于入门门槛的成本和开发的总体难度都比较低,因此不仅竞争更为激烈,而且应用的售价相比任何零售游戏都有着天壤之别。到头来,应用的成功严重依赖于销售的持续性。

因此,在本章的讨论中,不成功的应用指的就是销量不佳的应用(但并不一定是一款糟糕的应用),或者是一款再也流行不起来的应用,在两者之中,或许后者更为突出。由于你很难找到一款值得一试,却又销量不佳的应用(因为大多数应用的销量都不怎么样),因此你可以选择那些已经不再流行,但依然能被找到的应用,并从中学到更多东西。在明白这个道理之后,你就能从对此类应用的分析中得到双倍的好处:

  • 可以从它们的错误中学习,不管是在市场营销方面的(可以进行合理猜测),还是在功能实现方面的。
  • 并且/或者你可以了解它们之所以不再流行的原因(如果它们曾经流行过的话),这其中就体现出了市场的变化。

为了能最高效地利用时间,你可以通过一种巧妙的方式找到那些可供借鉴经验的不成功应用。秘密就在于用户评论,你可以将它们当作“链接”,找出用户比较喜欢的应用,从而引导你从“不成功”类别进入“成功”应用的类别。

如果你发现某个看起来有点可疑或者值得商榷的评论时,只要点击评论者的名称链接,就可以看到该用户的其他评论列表。通过这个好办法,你就再也不必担心是否会被不合理的评论所误导了。

以下列出了一些最可靠的搜索技巧,可以使你从本文所定义的不成功应用中收集到更多的信息:

(1) 利用关键字进行搜索,找出一系列可能匹配的结果(iTunes是最佳选择)。

(2) 另外打开一个窗口,准备好一两个评分网站。Appannie.com或Mobclix.com(然后进入“应用评分”(App Ranking)栏目)是两个不错的选择。这两个网站不仅允许你查看目前的评分,更重要的是,Mobclix甚至还允许根据关键字和评分进行搜索,并显示出评论列表(不过,在本文撰写之时,其中部分信息似乎已经过期好几个月了)。你可以将同一个关键字放进iTunes和类似Mobclix这样的网站中同时搜索,看看都出现了些什么应用,更重要的是,你还能看见搜索到的评分列表,这是非常有用的。你可以在前100名至1000名中选择合适的研究对象。

(3) 在iTunes中,你要深入研究搜索结果前几页中的应用,因为它们虽然在搜索中排名靠前,但并不一定是某类别中的佼佼者—— 当你将它们的名称输入评分搜索工具中时,就会知道了。

(4) 在iTunes的用户评论中(或者在移动版App Store浏览器中),应该看看以下4个部分:评分数、是否至少拥有几条评论(如果没有评论,就可以直接跳过了)、最近更新时间,以及目前的评分。

(5) 快速地找出那些评分数量比较少(低于1000次的比较合适),而且至少有几条评论的应用。接着,大致地浏览一下,尤其是把用户更喜欢的其他应用名称记录或复制下来,还可以简明地写下它们所欠缺的功能特性。如果这款应用只有为数不多的几条评论,那么应该点击评论者的名称,进一步了解这是否是合法用户的意见。

(6) 如果你对某款应用很感兴趣,想要深入了解它(如其既往评分记录),那么可以在Appannie.com这样的网站中将应用名称输入进去,就能得到你所需要的一切信息了。在图2中,你可以看到,用“The Moron Test”(“笨蛋测试”)进行搜索,Appannie出色的评分历史工具就给出了相应的信息。

图2 根据Appanie,“笨蛋测试”的评分始终居高不下,你还能发现一个有趣的地方,那就是它曾经一度出现在“智力游戏”(Puzzle andGames)类别中

从别人的错误中学习

不管是那些距离最佳应用只有一步之遥的作品,还是真正的最佳作品,你都能从中学到同样多的东西,而且前者教给你的或许还更多一些。在这一方面,核心想法(或做法)就是从应用环境中评分较低的一款或多款作品下手,然后通过(用户和记者的)评论,一步一步地上升到高评分的应用,同时对它们进行试玩,最后,你就能将应用环境中与应用息息相关的一些要点都记录下来了。因此,这一过程将会让你成为该应用环境中的专家,在动手开发的时候,能够做足指导开发的准备。

竞争性应用研究的真正优势在于,你可以找出对手的应用(成功的和不成功的)中欠缺了什么,或者有什么地方没做好,于是,你就能找到机会弥补这一需求。当你偶然遇见新的应用时,可以试玩一下,看看有没有错误或者功能上的毛病,并且要时刻记得看看用户评论,抓住其缺失的关键功能特性。

对那些比较流行的应用,记者的评论会更加中肯,因为通常只有那些推广力度较大的应用才会首先得到评测。总的来说,你可以从记者评论中了解一名专业从事这方面工作的人的看法,这样的意见具有比较高的价值。毕竟,当你自己的应用发布时,一定会希望这些专业人士能够给出正面的评论。

从别人的意见中学习

要想从其他应用的错误中吸取教训,查看用户的意见是很有裨益的。正如之前所说,有些意见是虚假无效的,或是没有建设性的,你应该避开它们。在iTunes的用户评论中,你就能看到大部分的意见,不过,也别忘了看看开发者网站的论坛(如果有),并且使用谷歌搜索应用的名称,后边再加上“评价”两字。对于任何一款与成功稍微沾点边的应用,你都能够搜索到大量的结果。

下面简单地列出了在查阅评论时,一些有用的关键性元素:

祈使句型,如“我希望它能(加入什么功能特性)……”或者“如果……就会更好”或“它需要……”。

缺点列表,有时位于边栏,通常在底部,或者跟在优点列表的后面。

记者评论中的总结部分往往都是一针见血的。

在看了够多的意见或者希望添加的功能特性以后,就会产生某种“云朵”效应,让你觉得其中有一些出现频率更高的想法。你要特别留意,并将其记下,有机会的话就实现其中一个功能特性,或者在开发时回头考虑考虑,因为这一功能特性很可能实现起来特别困难/成本高昂。

例如,在“原型”发布之后,笔者将所有的反馈意见编辑成统一的格式,组成了一张长长的排序表格,并将每一种意见都分了类。最受期待的功能特性很明显地就是“需要更多地图”,但同时也有很多意见都集中在“需要战役”和“需要更强的定制性”上。至于意见方面,在一开始,开发人员收到了很多“友军不开火”或者“近战斧子太强大了”这样的评论。如果你要在这一应用环境中与之竞争,那么,既然“原型”有意识地专注于某些方面,你就应该在几个关键的方向上与之形成区别,并且寻找竞争对手所欠缺的地方,此时,用户的意见就是个很好的信息来源。

《AppStore创赢艺术——Apple开发的赚钱机密》试读电子书免费提供,有需要的留下邮箱,有空即发送给大家。 别忘啦顶哦!


    
[3] BB10 Cascades: 旋钮组件的使用
    来源: 互联网  发布时间: 2014-02-18
BB10 Cascades: 按钮组件的使用

 在BB10 Cascades的QML中提供了按钮组件,也就是Button组件,通过它可以为用户提供一个操作按钮。

对于简单的界面操作,可以在QML中直接为按钮编写javascript代码,通过javascript执行一些操作,如果涉及到复杂的后台操作,可以在按钮事件中通过javascript调用C++/QT对象的方法。

本文先讨论如何通过简单的javascript代码为按钮添加动作。

 

按钮组件的使用比较简单,我们还是使用之前博文使用的“HelloWorld”样例来演示。

 

首先通过QML编辑器打开mail.qml页面,然后从左下角拖拽按钮控件到QML编辑器中,在希望插入按钮的地方释放鼠标,我是将按钮插入到“hello world”标签之前,所以我将按钮组件拖拽到"helllo world"那个“label”组件的上方。

拖拽完成后Cascades IDE会自动生成按钮的QML代码,选中生成的QML代码,就可以在QML Properties页面中修改按钮属性了。在Text一栏中可以输入按钮的文字,我输入的是“Chang Value”。点击On click旁边的闪电形按钮可以生成该按钮的onClicked方法,我希望点击按钮可以修改“hello world”标签的文字,所以我在onClicked事件中输入了代码:

 myLabel.text = qsTr("New String");


注意这里使用了组件名myLabel,但是目前没有为“hello world”标签指定名称,所以这时运行测试程序会报找不到“myLabel”。

我们需要为“helllo world”标签指定一个名称,方法是选中对应的Label组件,在QML Properties页面中将ID设置成指定的名称,本例将“Hello World”标签的id设置成myLabel。

 

有关按钮的创建请参考下图:

 

另外,通过javascript除了可以修改标签组件的文字以外,还可以修改组件的其它属性,比如通过“布局属性”的修改可以改变一个组件的位置。我在以上的养例中添加了第二个按钮,按钮文字为“Change Position”, onClicked代码为:

myLabel.horizontalAlignment = HorizontalAlignment.Left;


这样点击“Change Position”按钮时“hello world”标签就会变成左对齐。

 

大家可以测试运行一下,同时可以在测试一下按钮的其它QML属性。

 

下面是完整的mail.qml代码,供参考:

 

// creates one page with a label

Page {
    Container {
        layout: StackLayout {
        }
        Button {
            horizontalAlignment: HorizontalAlignment.Center
            onClicked: {
                myLabel.text = qsTr("New String");
            }
            text: "ChangValue"
        }
        Button {
            text: "Change Position"
            onClicked: {
                myLabel.horizontalAlignment = HorizontalAlignment.Left;
            }
            horizontalAlignment: HorizontalAlignment.Center
        }
        Label {
            id: myLabel
            text: qsTr("Hello World")
            textStyle.base: SystemDefaults.TextStyles.BigText
            verticalAlignment: VerticalAlignment.Center
            horizontalAlignment: HorizontalAlignment.Center
        }
    }
}


 


    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3