- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我让应用程序从启动画面开始,然后打开列表 Activity 行,单击任何行将打开一个包含 TextView 的 Activity 、两个按钮(其中一个打开无限画廊,另一个打开自定义对话框)和菜单项(关于、偏好、退出)。
此应用程序在姜面包上运行完美,但在运行果冻 bean 的 galaxy s3 上进行测试时,它可以正常打开,但当您单击其中一个 listactivity 行时,它似乎忽略了单击。 eclipse 上的日志猫显示:
SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
但是,没有强制关闭(listactivity 滚动正常,菜单项正常工作)。
更新:
我注意到这个应用程序的一些东西:大约一个月前我用 eclipse 创建了它,名字可以说是 (trip
),今天在两个姜面包上测试 (trip.apk
)和果冻 bean ,它完美地工作。
但是我想将名称从 trip
更改为 travel
而我没有使用 Refactor。相反,我创建了一个名为 travel
的应用程序名称的新项目,但所有其他内容都与之前的应用程序 trip
相同,包括类、资源,并且在使用 jelly bean 进行测试时显示:
SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
更新 3:
我解决了这个问题:
我将此行添加到我的应用程序中的所有 TextViews 中:
android:textIsSelectable="true"
并且该行导致行忽略点击,
所以我删除了它,现在新旧应用程序都可以在两个 API 上正常工作。
更新 4:
以上短语与旧问题相关且已解决,
现在的问题是:
我的应用程序与所有 API 完美配合,但在测试时:
galaxy S3 running jelly bean 也能完美运行,
但在 eclipse log cat 中显示错误:
SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
在不影响应用程序性能的情况下,解决该错误的任何想法。
任何解释将不胜感激,谢谢。
我的项目代码:
菜单:
public class Menu extends ListActivity {
String classes[] = { "Introduction", "DreamsTrip", "Day one", "Day Two",
"Day Three", "Day Four", "Day Five", "Conclusion" };
@Override
protected void onCreate(Bundle savedInstanceState) {
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
super.onCreate(savedInstanceState);
// create background for whole list as image
ListView lv = getListView();
lv.setCacheColorHint(0);
lv.setSelector(android.R.color.transparent);
lv.setPadding(30, 0, 30, 0);
lv.setVerticalScrollBarEnabled(false);
lv.setBackgroundResource(R.drawable.list_background);
lv.setDivider(new ColorDrawable(0x00000000));
setListAdapter(new MyArrayAdapter(this, classes));
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
String cheese = classes[position];
try {
Intent ourIntent;
if (position > 1 && position < 25) {
Class ourClass = Class.forName("com.test.demo.MyDay");
ourIntent = new Intent(Menu.this, ourClass);
ourIntent.putExtra("cheese", cheese);
} else {
Class ourClass = Class.forName("com.test.demo." + cheese);
ourIntent = new Intent(Menu.this, ourClass);
}
startActivity(ourIntent);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public boolean onCreateOptionsMenu(android.view.Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.cool_menu, menu);
getLayoutInflater().setFactory(new Factory() {
public View onCreateView(String name, Context context,
AttributeSet attrs) {
if (name.equalsIgnoreCase(
"com.android.internal.view.menu.IconMenuItemView")) {
try {
LayoutInflater li = LayoutInflater.from(context);
final View view = li.createView(name, null, attrs);
new Handler().post(new Runnable() {
public void run() {
view.setBackgroundResource(R.drawable.border3);
((TextView) view).setTextSize(25);
((TextView) view).setTypeface(FontFactory
.getBFantezy(getBaseContext()));
((TextView) view).setTextColor(Color.RED);
}
});
return view;
} catch (InflateException e) {
} catch (ClassNotFoundException e) {
}
}
return null;
}
});
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.aboutUs:
Intent i = new Intent("com.test.demo.ABOUT");
startActivity(i);
break;
case R.id.preferences:
Intent p = new Intent("com.test.demo.PREFS");
startActivity(p);
break;
case R.id.exit:
finish();
break;
}
return false;
}
}
MyArrayAdapter:
public class MyArrayAdapter extends ArrayAdapter<String> {
private final Activity context;
private final String[] classes;
Typeface tf;
static class ViewHolder {
public TextView text;
public ImageView image;
}
public MyArrayAdapter(Activity context, String[] classes) {
super(context, R.layout.row, classes);
this.context = context;
this.classes = classes;
tf = Typeface.createFromAsset(context.getAssets(), "BFantezy.ttf");
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View rowView = convertView;
if (rowView == null) {
LayoutInflater inflater = context.getLayoutInflater();
rowView = inflater.inflate(R.layout.row, null);
ViewHolder viewHolder = new ViewHolder();
viewHolder.text = (TextView) rowView.findViewById(R.id.row_label);
viewHolder.image = (ImageView) rowView.findViewById(R.id.row_image);
viewHolder.text.setTypeface(FontFactory.getBFantezy(getContext()));
rowView.setTag(viewHolder);
}
ViewHolder holder = (ViewHolder) rowView.getTag();
String s = classes[position];
holder.text.setText(s);
if (s.equals("Day one")) {
holder.image.setImageResource(R.drawable.day1);
}
if (s.equals("Day Two")) {
holder.image.setImageResource(R.drawable.day2);
}
if (s.equals("Day Three")) {
holder.image.setImageResource(R.drawable.day3);
}
if (s.equals("Day Four")) {
holder.image.setImageResource(R.drawable.day4);
}
if (s.equals("Day Five")) {
holder.image.setImageResource(R.drawable.day5);
}
if (s.equals("Conclusion")) {
holder.image.setImageResource(R.drawable.day_concl);
}
if (s.equals("DreamsTrip")) {
holder.image.setImageResource(R.drawable.day_trip);
}
if (s.equals("Introduction")) {
holder.image.setImageResource(R.drawable.day_intr);
}
return rowView;
}
}
我的一天:
public class MyDay extends Activity {
final Context context = this;
private Button button;
TextView tv2, tv3, tv4;
String day;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
Boolean customTitleSupported = requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
setContentView(R.layout.day);
if (customTitleSupported) {
getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE,
R.layout.custom_title);
}
initializeTextViews();
}
private void initializeTextViews() {
tv2 = (TextView) findViewById(R.id.day_tv1);
tv2.setTypeface(FontFactory.getBFantezy(getBaseContext()));
tv3 = (TextView) findViewById(R.id.day_tv3);
tv3.setTypeface(FontFactory.getDroidNaskh(getBaseContext()));
day = getIntent().getStringExtra("cheese");
if (day.equalsIgnoreCase("Day One")) {
tv2.setText(Html.fromHtml(getString(R.string.beginning)));
tv3.setText(Html.fromHtml(getString(R.string.day1)));
button = (Button) findViewById(R.id.city_button);
button.setOnClickListener(new OnClickListener() {
public void onClick(View arg0) {
// custom dialog
final Dialog dialog = new Dialog(context,
R.style.cust_dialog);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(R.layout.custom_dialog);
// set the custom dialog components - text, image and button
TextView text = (TextView) dialog
.findViewById(R.id.dialog_text);
text.setTypeface(FontFactory.getBFantezy(getBaseContext()));
text.setText(Html
.fromHtml(getString(R.string.torusim_places_1)));
Button dialogButton = (Button) dialog
.findViewById(R.id.dialog_Button);
dialogButton.setTypeface(FontFactory
.getBFantezy(getBaseContext()));
// if button is clicked, close the custom dialog
dialogButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
dialog.dismiss();
}
});
dialog.show();
}
});
} else if (day.equalsIgnoreCase("Day Two")) {
tv2.setText(Html.fromHtml(getString(R.string.beginning)));
tv3.setText(Html.fromHtml(getString(R.string.day2)));
button = (Button) findViewById(R.id.city_button);
button.setOnClickListener(new OnClickListener() {
public void onClick(View arg0) {
// custom dialog
final Dialog dialog = new Dialog(context,
R.style.cust_dialog);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(R.layout.custom_dialog);
// set the custom dialog components - text, image and button
TextView text = (TextView) dialog
.findViewById(R.id.dialog_text);
text.setTypeface(FontFactory.getBFantezy(getBaseContext()));
text.setText(Html
.fromHtml(getString(R.string.torusim_places_2)));
Button dialogButton = (Button) dialog
.findViewById(R.id.dialog_Button);
dialogButton.setTypeface(FontFactory
.getBFantezy(getBaseContext()));
// if button is clicked, close the custom dialog
dialogButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
dialog.dismiss();
}
});
dialog.show();
}
});
} else if (day.equalsIgnoreCase("Day Three")) {
tv2.setText(Html.fromHtml(getString(R.string.beginning)));
tv3.setText(Html.fromHtml(getString(R.string.day3)));
button = (Button) findViewById(R.id.city_button);
button.setOnClickListener(new OnClickListener() {
public void onClick(View arg0) {
// custom dialog
final Dialog dialog = new Dialog(context,
R.style.cust_dialog);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(R.layout.custom_dialog);
// set the custom dialog components - text, image and button
TextView text = (TextView) dialog
.findViewById(R.id.dialog_text);
text.setTypeface(FontFactory.getBFantezy(getBaseContext()));
text.setText(Html
.fromHtml(getString(R.string.torusim_places_3)));
Button dialogButton = (Button) dialog
.findViewById(R.id.dialog_Button);
dialogButton.setTypeface(FontFactory
.getBFantezy(getBaseContext()));
// if button is clicked, close the custom dialog
dialogButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
dialog.dismiss();
}
});
dialog.show();
}
});
} else if (day.equalsIgnoreCase("Day Four")) {
tv2.setText(Html.fromHtml(getString(R.string.beginning)));
tv3.setText(Html.fromHtml(getString(R.string.day4)));
button = (Button) findViewById(R.id.city_button);
button.setOnClickListener(new OnClickListener() {
public void onClick(View arg0) {
// custom dialog
final Dialog dialog = new Dialog(context,
R.style.cust_dialog);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(R.layout.custom_dialog);
// set the custom dialog components - text, image and button
TextView text = (TextView) dialog
.findViewById(R.id.dialog_text);
text.setTypeface(FontFactory.getBFantezy(getBaseContext()));
text.setText(Html
.fromHtml(getString(R.string.torusim_places_4)));
Button dialogButton = (Button) dialog
.findViewById(R.id.dialog_Button);
dialogButton.setTypeface(FontFactory
.getBFantezy(getBaseContext()));
// if button is clicked, close the custom dialog
dialogButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
dialog.dismiss();
}
});
dialog.show();
}
});
} else if (day.equalsIgnoreCase("Day Five")) {
tv2.setText(Html.fromHtml(getString(R.string.beginning)));
tv3.setText(Html.fromHtml(getString(R.string.day5)));
button = (Button) findViewById(R.id.city_button);
button.setOnClickListener(new OnClickListener() {
public void onClick(View arg0) {
// custom dialog
final Dialog dialog = new Dialog(context,
R.style.cust_dialog);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(R.layout.custom_dialog); // set the
// custom dialog components - text, image and button
TextView text = (TextView) dialog
.findViewById(R.id.dialog_text);
text.setTypeface(FontFactory.getBFantezy(getBaseContext()));
text.setText(Html
.fromHtml(getString(R.string.torusim_places_5)));
Button dialogButton = (Button) dialog
.findViewById(R.id.dialog_Button);
dialogButton.setTypeface(FontFactory
.getBFantezy(getBaseContext()));
// if button is clicked, close the custom dialog
dialogButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
dialog.dismiss();
}
});
dialog.show();
}
});
}
}
public void handleClick(View v) {
// Create an intent to start the new activity.
Intent intent = new Intent();
intent.setClass(this, DayGallery.class);
intent.putExtra("dayname", day);
startActivity(intent);
}
}
日志:
D/AbsListView(14159): Get MotionRecognitionManager
D/dalvikvm(14159): GC_FOR_ALLOC freed 81K, 9% free 12164K/13315K, paused 13ms, total
13ms
I/dalvikvm-heap(14159): Grow heap (frag case) to 14.306MB for 1555216-byte allocation
D/dalvikvm(14159): GC_CONCURRENT freed 2K, 8% free 13681K/14855K, paused 12ms+1ms,
total 20ms
D/dalvikvm(14159): GC_FOR_ALLOC freed 0K, 8% free 13681K/14855K, paused 10ms, total
10ms
I/dalvikvm-heap(14159): Grow heap (frag case) to 16.941MB for 2764816-byte allocation
D/dalvikvm(14159): GC_CONCURRENT freed 0K, 7% free 16381K/17607K, paused 12ms+2ms,
total 23ms
D/libEGL(14159): loaded /system/lib/egl/libEGL_mali.so
D/libEGL(14159): loaded /system/lib/egl/libGLESv1_CM_mali.so
D/libEGL(14159): loaded /system/lib/egl/libGLESv2_mali.so
D/(14159): Device driver API match
D/(14159): Device driver API version: 10
D/(14159): User space API version: 10
D/(14159): mali: REVISION=Linux-r2p4-02rel0 BUILD_DATE=Tue Oct 16 15:37:13 KST 2012
D/OpenGLRenderer(14159): Enabling debug mode 0
D/dalvikvm(14159): GC_FOR_ALLOC freed 1732K, 16% free 15672K/18439K, paused 19ms,
total 19ms
E/SpannableStringBuilder(14159): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero
length
E/SpannableStringBuilder(14159): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero
length
E/SpannableStringBuilder(14159): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero
length
E/SpannableStringBuilder(14159): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero
length
D/dalvikvm(14159): GC_CONCURRENT freed 691K, 13% free 16102K/18439K, paused 13ms+2ms,
total 27ms
E/SpannableStringBuilder(14159): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero
length
E/SpannableStringBuilder(14159): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero
length
E/SpannableStringBuilder(14159): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero
length
E/SpannableStringBuilder(14159): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero
length
W/OpenGLRenderer(14159): Shape round rect too large to be rendered into a texture
(680x12472, max=4096x4096)
W/OpenGLRenderer(14159): Shape round rect too large to be rendered into a texture
(688x12480, max=4096x4096)
E/SpannableStringBuilder(14159): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero
length
E/SpannableStringBuilder(14159): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero
length
E/SpannableStringBuilder(14159): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero
length
最佳答案
要理解这里发生的事情,一切都始于关于 TextView
应该是什么和不应该是什么的设计决策。根据the android source for TextView :
/**
* Displays text to the user and optionally allows them to edit it. A TextView
* is a complete text editor, however the basic class is configured to not
* allow editing; see {@link EditText} for a subclass that configures the text
* view for editing.
这意味着,即使您所做的只是在屏幕上放置一段文本,隐藏在其后的还有全文突出显示、选择和编辑功能。这里发生的事情是,为解决其中的一个问题而进行的一点调整似乎干扰了其他一些功能,并创建了一些日志行。比方说,Nexus 7 error "SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length" 赋予了这种情况更多的权重。 ,其中似乎在某些 Android 版本上可以通过禁用文本(输入)字段中的自动完成来解决这种情况:
View.setInputType( InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS );
这也可以在 XML 中使用 TextView
的相应标签来完成:
android:inputType="none"
有问题的行似乎已经到达 Android 4.1 (Jelly Bean),在 SpannableStringBuilder
的 setSpan
函数中(例如 2.2.3 source vs 4.1.1 source ) .尝试在零长度字符串中设置跨度会触发日志行。这就是为什么设置它以便不需要选择文本的(子)部分应该避免这个错误,通过上面的提示或使用:
android:textIsSelectable="false"
android:editable="false"
一个更具推测性的解决方案可能是通过向每个字符串添加字符“\u200b”(一个未显示的零宽度空白字符)来确保 TextView
中永远不会有空白字符串通过在自定义 TextView
中覆盖 setText
(将其简单地添加到字符串的末尾)或通过将它在您的代码中用于发送到 TextView
s 的每个字符串。
根据 this piece of android source,对于那些喜欢钻研 android 系统并重写它的部分内容的人来说看起来可以通过以下方式解决问题。但是,绝对不能保证它有效。真正勇敢(蛮干)的人可以自己写一个完整的SpannableStringBuilder....
创建您自己的 SpannableStringBuilder
形式来捕获条件。这个例子只是安静地停止,而不是像原来那样大声停止:
import android.text.SpannableStringBuilder;
public class MySpannableStringBuilder extends SpannableStringBuilder {
// Taken from SpannableStringBuilder.java
private static final int MARK = 1;
private static final int POINT = 2;
private static final int START_MASK = 0xF0;
private static final int END_MASK = 0x0F;
private static final int START_SHIFT = 4;
MySpannableStringBuilder() {
super();
}
MySpannableStringBuilder(CharSequence text) {
super(text);
}
MySpannableStringBuilder(CharSequence text, int start, int end) {
super(text, start, end);
}
@Override
public void setSpan(Object what, int start, int end, int flags) {
// Determine if the error is going to be triggered, if so fail silently
int flagsStart = (flags & START_MASK) >> START_SHIFT;
int flagsEnd = flags & END_MASK;
if (flagsStart == POINT && flagsEnd == MARK && start == end) {
return;
}
// All good, so call the real routine
super.setSpan(what, flagsStart, end, flagsEnd);
}
}
创建 MyEditableFactory extends Editable.Factory
并将其设置为返回您的 SpannableStringBuilder:
import android.text.Editable;
public class MyEditableFactory extends Editable.Factory {
private static MyEditableFactory sInstance = new MyEditableFactory();
/**
* Returns this Editable Factory.
*/
public static Editable.Factory getInstance() {
return sInstance;
}
public Editable newEditable(CharSequence source) {
return new MySpannableStringBuilder(source);
}
}
除了编写操作系统的自定义版本并将其安装在手机上,我不确定还有什么可能。
欢迎所有改进建议,以及在各种操作系统情况下使用此代码的反馈。
关于android - 果冻 bean 运行设备的列表 Activity 错误(SPAN_EXCLUSIVE_EXCLUSIVE 跨度不能为零长度),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16625798/
这就是我现在正在做的事情。我在设计中使用 LESS CSS。我需要在指定输入之间放置 2 个跨度。所有元素的宽度都应为 100%。跨度应始终为 20px 宽度输入宽度可以根据屏幕宽度进行更改。谁能帮帮
我有一个包含文本和输入字段的跨度。我想知道是否可以让文本左对齐,输入字段右对齐。 NAME: .textBox{ display:inline-block; width:450px
我有这个按钮,我想让它在我点击“选择”时调用方法,在我点击“更改”时调用另一个方法: Select Change 我尝试输入 (click)="method()",但没有成功。我很
我正在开发聊天应用程序 (cordova),当我要在无法输入的表情符号后输入文本时,我在这段代码中遇到了问题 https://output.jsbin.com/radaref This i
很抱歉,如果这是一个非常愚蠢的问题,但我是一名开发人员,目前我的设计技能很少,我在个人网站上工作并且遇到了一个小问题。 我有一个带 ul 的顶部导航和 li元素。这些元素包含链接 . 跨度仅在链接悬
fiddle :https://jsfiddle.net/burz4g8s/4/ 我的 HTML 包含多行双按钮对。服务器端应用程序在 JSP 循环中输出按钮,所以我无法控制各个按钮——我不能使用 d
TextView.setLetterSpacing允许设置字母间距/字符间距。 有没有对应的CharacterStyle / span class允许在 TextView? 中的文本子集上设置字母间距
如何使洋红色矩形比红色矩形短 6 倍? GridLayout { id: gridLayout anchors.fill: parent flo
我最近开始使用 Twitter Bootstrap,但我似乎无法理解 span 的作用以及为什么会有不同的编号 span,例如 span4、span12?什么是偏移量以及它们何时使用? (有时与跨度一
我正在尝试构建一个 jQuery 函数来计算跨度中的总数 var sumnormaltotal = 0; $('span[id^="normaloffertotalspan"]').each(func
我想知道haskell如何评估以下表达式。 span (`elem` ['A'..'Z']) "BOBsidneyMORGANeddy" 结果是 ("BOB","sidneyMORGANeddy")
我有三个词,我想在第一个空格之后的内容周围添加一个跨度,所以 hello world 变成: hello world 和: hello world again 变成: hello world agai
我正在寻找纯 CSS 解决以下问题的方法。 考虑以下 HTML: Some text Some text 两者都是 正在显示元素 inline-block .如何在第二个 的左侧
如何将 Span 放置在其容器的底部? 我目前拥有的:http://jsfiddle.net/wRbax/2/ 我希望 .box 始终位于 .td 的底部 CSS .td { vertical
我试图在 li 中 float 两个 span。左跨度将有我的标签,在右跨度内我将构建一个具有嵌套跨度的图形。我有基本结构,但 chrome 将数字放在左侧跨度的末尾。我该如何解决这个问题? HTML
我有一个像这样的 JavaScript 变量: var text = "A businessman should be able to manage his business matters"; 我想
一些内容可编辑的框与其他框重叠,因此并非所有框都是可编辑的。我想保留与跨度位置中心对齐的文本,如下所示。我如何实现这一点? span { margin: auto; text-alig
我正在使用 WYSIWYG (InnovaEditor) 来编辑我网站上的内容,它适用于 Chrome、IE,主要适用于 Firefox,但 FF 有一个稍微令人讨厌的问题。我将 span 标签插入到
这是我的 html: Settings Export Import 和CSS: span.button { float:right; margin-righ
这里是问题所在:http://jsfiddle.net/STG22/3/ 我希望 span 不会分成两个不同的行(就像上面示例中的第三行一样)。我该怎么做? CSS: span { backg
我是一名优秀的程序员,十分优秀!