我有一个包含很多视图的布局。是否有一种简单的方法可以禁用其所有视图点击事件?
答案 0 :(得分:34)
您可以传递View
以禁用所有子点击事件。
public static void enableDisableView(View view, boolean enabled) {
view.setEnabled(enabled);
if ( view instanceof ViewGroup ) {
ViewGroup group = (ViewGroup)view;
for ( int idx = 0 ; idx < group.getChildCount() ; idx++ ) {
enableDisableView(group.getChildAt(idx), enabled);
}
}
}
答案 1 :(得分:23)
您可以将此功能添加到父版面视图
,而不是遍历所有子视图@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return true;
}
这将在onTouchEvent
之前为任何子视图调用,如果它返回true
,则根本不会调用子视图的onTouchEvent
。如果需要,可以创建一个布尔字段成员来打开和关闭此状态。
答案 2 :(得分:12)
我会创建一个ViewGroup
,其中包含您要同时启用/禁用的所有视图,并调用setClickable(true/false)
启用/禁用点击。
答案 3 :(得分:5)
您需要在视图上调用view.setClickable(false);
view.setEnabled(false);
方法。
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\User;
use App\UserDetail;
use App\UserSex;
use App\Province;
use App\Http\Requests;
use App\Http\Controllers\Controller;
class UserController extends Controller {
...
public function show($id) {
//
$user = User::find($id);
$userDetail = User::find($id)->userDetail;
$userSex = User::find($id)->userSex;
$province = User::find($id)->province;
return view('users.show', get_defined_vars());
}
答案 4 :(得分:2)
fun View.setAllEnabled(enabled: Boolean) {
isEnabled = enabled
if (this is ViewGroup) children.forEach { child -> child.setAllEnabled(enabled) }
}
答案 5 :(得分:1)
在您的活动中创建一个布尔clickEnabled
并在点击监听器中进行检查;如果它是假的,不要做任何事情。
答案 6 :(得分:0)
如果您不想将所有子视图都设置为禁用状态(因为它们在启用状态方面可能看起来有所不同),则可以使用以下方法:
private fun toogleTouchable(canTouch: Boolean) {
container.descendantFocusability =
if (value) {
container.requestFocus()
ViewGroup.FOCUS_BLOCK_DESCENDANTS
} else {
ViewGroup.FOCUS_AFTER_DESCENDANTS
}
}
答案 7 :(得分:-3)
我会在您的activity类中实现onClickListener
接口,并在onClick
方法中返回false。我觉得这是解决问题的最简单方法。