下面列出了android.view.View#getOnFocusChangeListener ( ) 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
Presenter presenter = mPresenters.get(viewType);
Presenter.ViewHolder presenterVh = presenter.onCreateViewHolder(parent);
View view = presenterVh.view;
ViewHolder viewHolder = new ViewHolder(presenter, view, presenterVh);
if (mAdapterListener != null) {
mAdapterListener.onCreate(viewHolder);
}
View presenterView = viewHolder.mHolder.view;
if (presenterView != null) {
viewHolder.mFocusChangeListener.mChainedListener = presenterView.getOnFocusChangeListener();
presenterView.setOnFocusChangeListener(viewHolder.mFocusChangeListener);
}
if (mFocusHighlight != null) {
mFocusHighlight.onInitializeView(view);
}
return viewHolder;
}
@Override
public void onChildAttachedToWindow(View child) {
// 设置单击事件,修复.
if (!child.hasOnClickListeners()) {
child.setOnClickListener(mItemListener);
}
// 设置焦点事件,修复.
if (child.getOnFocusChangeListener() == null) {
child.setOnFocusChangeListener(mItemListener);
}
}
@Override
public void onChildAttachedToWindow(View child) {
if (!ViewCompat.hasOnClickListeners(child)) {
child.setOnClickListener(mItemListener);
}
child.setOnLongClickListener(mItemListener);
if (child.getOnFocusChangeListener() == null) {
child.setOnFocusChangeListener(mItemListener);
}
}
@Override
public void onChildAttachedToWindow(View child) {
// 设置单击事件,修复.
if (!child.hasOnClickListeners()) {
child.setOnClickListener(mItemListener);
}
// 设置焦点事件,修复.
if (child.getOnFocusChangeListener() == null) {
child.setOnFocusChangeListener(mItemListener);
}
}
/**
* {@link View.OnFocusChangeListener} that assigned in
* {@link Presenter#onCreateViewHolder(ViewGroup)} may be chained, user should never change
* {@link View.OnFocusChangeListener} after that.
*/
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (DEBUG) Log.v(TAG, "onCreateViewHolder viewType " + viewType);
Presenter presenter = mPresenters.get(viewType);
Presenter.ViewHolder presenterVh;
View view;
if (mWrapper != null) {
view = mWrapper.createWrapper(parent);
presenterVh = presenter.onCreateViewHolder(parent);
mWrapper.wrap(view, presenterVh.view);
} else {
presenterVh = presenter.onCreateViewHolder(parent);
view = presenterVh.view;
}
ViewHolder viewHolder = new ViewHolder(presenter, view, presenterVh);
if (mAdapterListener != null) {
mAdapterListener.onCreate(viewHolder);
}
View presenterView = viewHolder.mHolder.view;
if (presenterView != null) {
viewHolder.mFocusChangeListener.mChainedListener = presenterView.getOnFocusChangeListener();
presenterView.setOnFocusChangeListener(viewHolder.mFocusChangeListener);
}
if (mFocusHighlight != null) {
mFocusHighlight.onInitializeView(view);
}
return viewHolder;
}
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
// To prevent undesired "focus" and "blur" events during layout caused
// by ListView temporarily taking focus, we will disable focus events until
// layout has finished.
// First check for a quick exit. listView can be null, such as if window closing.
// Starting with API 18, calling requestFocus() will trigger another layout pass of the listview,
// resulting in an infinite loop. Here we check if the view is already focused, and stop the loop.
if (listView == null || (Build.VERSION.SDK_INT >= 18 && listView != null && !changed && viewFocused)) {
viewFocused = false;
super.onLayout(changed, left, top, right, bottom);
return;
}
OnFocusChangeListener focusListener = null;
View focusedView = listView.findFocus();
int cursorPosition = -1;
if (focusedView != null) {
OnFocusChangeListener listener = focusedView.getOnFocusChangeListener();
if (listener != null && listener instanceof TiUIView) {
//Before unfocus the current editText, store cursor position so
//we can restore it later
if (focusedView instanceof EditText) {
cursorPosition = ((EditText)focusedView).getSelectionStart();
}
focusedView.setOnFocusChangeListener(null);
focusListener = listener;
}
}
//We are temporarily going to block focus to descendants
//because LinearLayout on layout will try to find a focusable descendant
if (focusedView != null) {
listView.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);
}
super.onLayout(changed, left, top, right, bottom);
//Now we reset the descendant focusability
listView.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);
TiViewProxy viewProxy = proxy;
if (viewProxy != null && viewProxy.hasListeners(TiC.EVENT_POST_LAYOUT)) {
viewProxy.fireEvent(TiC.EVENT_POST_LAYOUT, null);
}
// Layout is finished, re-enable focus events.
if (focusListener != null) {
// If the configuration changed, we manually fire the blur event
if (changed) {
focusedView.setOnFocusChangeListener(focusListener);
focusListener.onFocusChange(focusedView, false);
} else {
//Ok right now focus is with listView. So set it back to the focusedView
viewFocused = true;
focusedView.requestFocus();
focusedView.setOnFocusChangeListener(focusListener);
//Restore cursor position
if (cursorPosition != -1) {
((EditText)focusedView).setSelection(cursorPosition);
}
}
}
}