一、简述
在项目开发中,有时候页面会比较长,这时候我们自然而然就想到采用ScrollView进行滑动,但这里我遇到一个小坑,因为ScrollView本身就是上下滑动效果,而像EditView有时候可能需要多行输入,那么这时候就会发现问题来了,EditView多行数据滑动不起效果,如下所示:
二、解决
明显可以看到多行情况下EditView无法滑动,导致这个原因是ScrollView的滑动事件与EditView滑动事件冲突,解决方案是在EditView的触摸事件中限制ScrollView不拦截
/**
* 设置触摸事件,由于EditView与TextView都处于ScollView中,
* 所以需要在OnTouch事件中通知父控件不拦截子控件事件
*/
private OnTouchListener touchListener = new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if(event.getAction() == MotionEvent.ACTION_DOWN
|| event.getAction() == MotionEvent.ACTION_MOVE){
//按下或滑动时请求父节点不拦截子节点
v.getParent().requestDisallowInterceptTouchEvent(true);
}
if(event.getAction() == MotionEvent.ACTION_UP){
//抬起时请求父节点拦截子节点
v.getParent().requestDisallowInterceptTouchEvent(false);
}
return false;
}
};
然后再设置EditView对象调用该事件即可
etContent.setOnTouchListener(touchListener);
三、滑动TextView设置
布局中可设置textView滑动的ScrollBar,具体如下:
另外在代码中还需要设置滑动调用的方法:
//textView滑动需要设置滑动方法
tvDefault.setMovementMethod(ScrollingMovementMethod.getInstance());
四、详细代码
布局文件:activity_main.xml
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:context="com.anand.textviewdemo.activity.MainActivity" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin" >
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/et_title" />
<EditText
android:id="@+id/et_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:drawable/edit_text"
android:gravity="start|top"
android:hint="@string/et_hint"
android:inputType="textMultiLine"
android:maxLines="8"
android:minLines="8"
android:scrollbars="vertical"
android:scrollbarStyle="outsideOverlay" />
<Button
android:id="@+id/btn_ok"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/btn_ok"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="@string/default_style" />
<TextView
android:id="@+id/tv_default"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/tvbar_bg"
android:maxLines="10"
android:minLines="10"
android:scrollbarFadeDuration="1000"
android:scrollbarStyle="outsideOverlay"
android:scrollbars="vertical"
android:singleLine="false" />
<ImageView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:contentDescription="@string/descriptionStr"
android:layout_marginTop="15dp"
android:adjustViewBounds="true"
android:src="@drawable/demo"/>
</LinearLayout>
</ScrollView>
Activity文件:MainActivity.java
package com.anand.textviewdemo.activity;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.text.TextUtils;
import android.text.method.ScrollingMovementMethod;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import butterknife.Bind;
import butterknife.ButterKnife;
import butterknife.OnClick;
import com.anand.textviewdemo.R;
/**
* ScrollView嵌套EditView或滑动的TextView冲突
* @ClassName: MainActivity
* @Description: ScrollView嵌套EditView或滑动的TextView冲突
* @author Anand
* @date 2017年6月28日 下午2:10:46
*/
public class MainActivity extends ActionBarActivity {
/** ButterKnife注入 **/
@Bind(R.id.et_content)
EditText etContent;
@Bind(R.id.btn_ok)
Button btnOk;
@Bind(R.id.tv_default)
TextView tvDefault;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//ButterKnife绑定Activity
ButterKnife.bind(this);
initView(); //初始化视图
initData(); //初始化数据
initEvent(); //初始化事件
}
/**
* 初始化视图
*/
private void initView() {
//设置触摸事件
etContent.setOnTouchListener(touchListener);
//textView滑动需要设置滑动方法
tvDefault.setMovementMethod(ScrollingMovementMethod.getInstance());
//设置触摸事件
tvDefault.setOnTouchListener(touchListener);
}
/**
* 设置触摸事件,由于EditView与TextView都处于ScollView中,
* 所以需要在OnTouch事件中通知父控件不拦截子控件事件
*/
private OnTouchListener touchListener = new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if(event.getAction() == MotionEvent.ACTION_DOWN
|| event.getAction() == MotionEvent.ACTION_MOVE){
//按下或滑动时请求父节点不拦截子节点
v.getParent().requestDisallowInterceptTouchEvent(true);
}
if(event.getAction() == MotionEvent.ACTION_UP){
//抬起时请求父节点拦截子节点
v.getParent().requestDisallowInterceptTouchEvent(false);
}
return false;
}
};
/**
* 初始化数据
*/
private void initData() {
}
/**
* 初始化事件
*/
private void initEvent() {
}
/**
* ButterKnife的OnClick注解
* 多个控件具有相同的事件
* @param btn
*/
@OnClick(R.id.btn_ok)
public void btnOnclick(Button btn){
String content = etContent.getText().toString().trim();
if(TextUtils.isEmpty(content)){
Toast.makeText(this,"编辑内容不能为空",Toast.LENGTH_SHORT).show();
return;
}else{
tvDefault.setText(content);
}
}
@Override
protected void onDestroy() {
super.onDestroy();
//ButterKnife解绑
ButterKnife.unbind(this);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
最后来一张修复后整体效果: