易错总结~ 发现,其实它的request挺多的,以及错一点都会全局错,还是多记下来吧。
https://blog.csdn.net/qq_31490071/article/details/82384011再报错???看看这个咯!!
here 1 :线性布局
android:orientation="vertical"/ horizontal 改变排布方式
android:layout_gravity="top"/ "center_vertical" / bottom
指定效果布满:
需要布满的: android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
剩下那个就是:
android:layout_width="wrap_content"
android:layout_height="wrap_content"
这样,上面可以填满剩下的空间
记得一个0dp,一个大大的1!!!!
2 监听器和创建按钮:
Button add_blog=(Button)findViewById(R.id.add_blog);
add_blog.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
}
});
3 添加intent:
新建
活动,而不是直接新建一个布局
那就先用显式的intent吧
New→Activity→Empty Activity
(只要不选是主activiy就行了哈哈哈)
这样,这个活动会自己去manifest里面注册好了~
[布局是动态加载出来的 super.onCreate(savedInstanceState);
setContentView(R.layout.activity_edit); 所以名字没事儿 不可怕
那么创建了之后,非常简单,肯定是要先new一个出来的,然后指定了前面和后面,最后就基本ok啦。
Intent intent=new Intent(MainActivity.this,EditActivity.class);
startActivity(intent);
传递个值过去:
字符串data,intent.putExtra("....",data) 第一个参数是键 第二是传递的
取得 Intent intent = getIntent();
String data = intent.getStringExtra("extra_data"); // 注意这里竟然只是一个引号就好了 getBooleanExtra.. 参数多一个default
传递回来:startActivityForResult() 方法接收两个参数,第一个参数还是Intent,第二个参数是请求码,,还有onresult什么的,在书里自己看吧qwq
跳出框框提示
4. 把数据库里面的东西存储到listview里面
listview需要 适配器:
使用android.R.layout.simple_list_item_1 作为ListView子项布局的id,这是一个Android内置的布局文件,里面只有一个TextView,可用于简单地显示一段文本。
(这个具体看那个(三)里面了
5 Toast用法
Toast.makeText
(FirstActivity.this, "aaaaa",Toast.LENGTH_SHORT).show();
context写自己.this
Log.d(.....0) 用法 前面tag是字符串,可以是这个活动的名字, 后面的也是字符串
6.Date类型和获取时间
发现这个老哥是获取了date直接设置的,不错,这样显然更方便一点
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
String dateString = sdf.format(date);
tv_date.setText(dateString);
(ps: 在写好的里面改,好像库不能直接新建而要升级。emmm先不知道,所以先卸载再来之后再说 1 oncreate里面改了 2 查询的时候有了 3 存储进去的时候有 4 listview显示
)
7.Image BUtton
qwq 先做了一个imageButton:找不到该放在哪,还是回书上
这里我们在res目录下新建一个drawable-xhdpi目录,然后将事先准备好的两张图片img_1.png和img_2.png复制到该目录当中。但是为啥新建了目录根本看不到?
【名字不能有- 只能数字字母或者 下划线!】
但是,这样做效率也太低了,这button仅仅是放了上去而已,想随屏滚动、想控制xx真是刀山火海啊。
所以搜了半天,发现一个文本编辑的span类 下面这样是可以的 但只能设置一个
int start =edit_passage.getSelectionStart();
int end = edit_passage.getSelectionEnd();
SpannableStringBuilder ssb = new SpannableStringBuilder(edit_passage.getText().toString());
ssb.setSpan(new UnderlineSpan(), start, end, Spanned.SPAN_INCLUSIVE_INCLUSIVE);
edit_passage.setText(ssb);
修改样式的位置是[start,end) 和substring一样 是左闭 右开的
就是这个问题:只能用一次,之后设置,之前的不管用了。不懂行的想substring一下,还是不行的,看到下面的博客:https://blog.csdn.net/gxp1182893781/article/details/76916796
无论what使用哪种,一定要注意一个问题:每个CharacterStyle对象只能应用于一个Spanned,也就是说每个CharacterStyle对象只能使用一次。如果在给定的String中对多个字符应用,则只有最后一次应用会起作用。(没错)emememem.. 但是对于一个bulider,这个似乎是没用的ememem
builder.setSpan(CharacterStyle.wrap(colorSpan[rand]), i - 1, i, Spanned.SPAN_INCLUSIVE_INCLUSIVE); 这个并不行 只是它那个bulider更替了很多次
但是text坏掉了 照我们这样每次取出来 的text只是个string 不带样式的string而已 所以设置一次之后再设置 就走形了...
可以不提取string先试试吗?好了好了我知道你这个ssb可以这样了,我们来现实一点骨干一点好吗
啊啊啊啊啊啊啊啊!苦苦看了好半天,原来我的问题竟然出现在
edittext的获取方法上~!!! 应该是geteditabletext,如果gettext再tostring,你的样式当然没了 ,还是自己蠢吧,难怪别人都没遇到这种问题,大概本来别人就觉得不是问题吧……
如果可以!!更有的放矢一点!你现在还是个菜菜菜菜鸟,前几天还在犯忘记找id的错误
(注意一下区间可能多点少点
变化颜色:ssb.setSpan(CharacterStyle.wrap(new ForegroundColorSpan(Color.GREEN)),start, end, Spanned.SPAN_INCLUSIVE_INCLUSIVE);
那么现在,新增个格式可以了。那么只有你选中的span都有格式,才能取消。如果卡在中间,就覆盖(这种情况不用判断啦
区间取消
这个emm。。 经过一番努力,
StyleSpan[] spans = edit_passage.getEditableText().getSpans(i, i + 1, StyleSpan.class);
for (StyleSpan span : spans) {
还真是,获取到你这个里有啥span,qwq,至于数组,是获取到有什么其他span吧qwq这样看挺好的还
起码qwq 分别加span样式的方法有了。。。(editable)
你需要:
ssb.setSpan(new StyleSpan(Typeface.BOLD)
(有点脑子;为什么几乎一样的上面可以下面 就不行?没理由呀,是你自己写错了吧。
subSequence(start, end)直接返回区间,直接分割。
发现removespan并不起作用。现在是可以调用人家的开源的外部库来编辑了呀。。。要是坐到像下载的那个那样这么好看就好了
emmmm,到底怎么能起作用呢?灵光一现,虽然editable.removespan 这个方法没有报错,但是显然,它是给ssb类写的~
这样我ssb.removespan。
随机把它settet(ssb)。这大概需要一点灵性~~~
好了,继续改了qwq啦啦啦
subsequence 左臂右开same
调试不出来。还是自己想的,大概斜体和下划线不一样而已qwq。。。
不一样而已。如果一样,会把StyleSpan的全部都给清除的。而underline不是一类的,这一类的还有的是 italic。
好的。那就可以回到原来的,用for循环判断了。
emmmm嗯。。。 直接removespan似乎是不行的,需要先getspan,再直接拿走掉。
if(cnt==num){
StyleSpan[] spans=ss.getSpans(start, end, StyleSpan.class);
for(int j=0; jif(spans[j].getStyle()==Typeface.BOLD)
ss.removeSpan(spans[j]);
}
然后,代码可以再精简点,也可不用,先实现。
还有color和size,加underline。color应该好办吧(继续看即可)size
if(isRemove) {
SpanPart spanStyle = new SpanPart(fontStyle);
spanStyle.start = getEditableText().getSpanStart(span);
spanStyle.end = getEditableText().getSpanEnd(span);
if(span instanceof AbsoluteSizeSpan){
spanStyle.fontSize = ((AbsoluteSizeSpan) span).getSize();
}else if(span instanceof ForegroundColorSpan){
spanStyle.color = ((ForegroundColorSpan) span).getForegroundColor();
}
spanStyles.add(spanStyle);
getEditableText().removeSpan(span);
===================================================
复制别人的: 改gradle版本,先改外面的
然后 gradle可以用本地的(换好路径就ok
若有这个错:Warning:Configuration 'testCompile' is obsolete and has been replaced with 'testImplementation' and 'testApi'.
我的解决方法是,在 app 的 Gradle 中:【注意 是app下面的gradle~】
compile 改为 implementation
androidTestCompile 改为 androidTestImplementation
testCompile 改为 testImplementation
这样替换了过时的,再重新编译即可。
图上要 字数和编辑选项
dbHelper.getWritableDatabase();、
感觉还是先看老大哥的教程
什么的好啊自己踩坑太多了 …… 聊天界面什么的书上也讲的很好只是我没学qwq
最后把注释都删掉,为了好看,或者搞两个版本
https://developer.android.google.cn/reference/android/text/SpannableStringBuilder.html