#android #android-viewpager #navigation-drawer
#Android #панель поиска #панель навигации
Вопрос:
Я хочу использовать панель поиска в панели навигации
По сути, мне нужно сдвинуть влево и вправо, чтобы установить панель поиска, и, как вы уже догадались, она перемещает панель навигации…
Что я хотел бы сделать, так это сдвинуть панель поиска, когда она сфокусирована, и navigationdrawer, когда это не так.
Как мне это сделать?
Вот мой код при настройке элемента (я еще не установил панель поиска)
private View onCritereView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View mView = inflater.inflate(R.layout.fragment_critere, container, false);
LinearLayout mLinearLayout = (LinearLayout) mView.findViewById(R.id.critere_linearlayout);
View mViewElement = inflater.inflate(R.layout.item_critere, null);
((TextView)mViewElement.findViewById(R.id.critere_title)).setText("Prix Maximum");
mLinearLayout.addView(mViewElement);
return mView;
}
Вот item_critere.xml
с панелью поиска:
<?xml version="1.0" encoding="utf-8"?>
<TableLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@ id/critere_item"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:stretchColumns="*">
<TableRow
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="Large Text"
android:id="@ id/critere_title"
android:layout_gravity="left|center_vertical"
android:layout_column="0"/>
<SeekBar
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@ id/critere_qualifier"
android:layout_column="1"
android:layout_span="4"/>
</TableRow>
<TableRow
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceSmall"
android:text="Medium Text"
android:id="@ id/critere_value"
android:layout_span="4"/>
</TableRow>
</TableLayout>
Заранее спасибо 🙂
Ответ №1:
Просто добавьте onTouchListener
. При касании экрана на панели поиска (action_down) запретить родительскому перехватывать событие.
seekbar.setOnTouchListener(new ListView.OnTouchListener()
{
@Override
public boolean onTouch(View v, MotionEvent event)
{
int action = event.getAction();
switch (action)
{
case MotionEvent.ACTION_DOWN:
// Disallow Drawer to intercept touch events.
v.getParent().requestDisallowInterceptTouchEvent(true);
break;
case MotionEvent.ACTION_UP:
// Allow Drawer to intercept touch events.
v.getParent().requestDisallowInterceptTouchEvent(false);
break;
}
// Handle seekbar touch events.
v.onTouchEvent(event);
return true;
}
});
Комментарии:
1. На самом деле это было скопировано для использования ListViews внутри ScrollView. Итак, это новая панель поиска. OnTouchListener вместо ListView.OnTouchListener. Это действительно простой способ, и он работает для многих подобных проблем
2. Хорошо, теперь сложнее. x) Я добавил вид прокрутки между панелью навигации и панелью поиска. Я хочу отключить только событие interceptTouch панели навигации, а не scrollview x) Возможно ли это?
3. итак, у вас есть вертикальная полоса прокрутки с горизонтальными полосами поиска в вашем ящике, верно?
4. Я думаю, что это должно работать просто отлично, без необходимости дальнейшей реализации. Если вы коснетесь панели поиска, событие будет перехвачено только для панели поиска. Если вы коснетесь другого места в scrollview, все будет идти так, как должно
5. Arf nop :/ Прокрутка работает с навигационным ящиком. Он различает горизонтальное / вертикальное движение. Но на панели поиска горизонтальное движение не улавливается ни панелью поиска, ни navigationdrawer.
Ответ №2:
Использование DrawerLayout.setDrawerLockMode
вместо ViewParent.requestDisallowInterceptTouchEvent
.
В @dumazy ответ requestDisallowInterceptTouchEvent
решает эту проблему, но он также создает другую.
Во время прокрутки в панели навигации, если вы нажмете на панель поиска, OnSeekBarChangeListener
сработает. Таким образом, событие прокрутки прервется, и прогресс панели поиска начнет меняться при перемещении пальца.
Я немного изменил исходный ответ, чтобы решить эту проблему, используя DrawerLockMode
:
mSeekBar.setOnTouchListener(new SeekBar.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
int action = event.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
// Disallow Drawer to intercept touch events.
// v.getParent().requestDisallowInterceptTouchEvent(true);
mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_OPEN);
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
// Allow Drawer to intercept touch events.
// v.getParent().requestDisallowInterceptTouchEvent(false);
mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNDEFINED);
break;
}
// Handle SeekBar touch events.
v.onTouchEvent(event);
return true;
}
});