DrawerLayout предотвращает сенсорные события в EditText

У меня есть DrawerLayout, в котором есть EditText и ListView. Проблема в том, что я не могу коснуться своих элементов EditText или ListView. Вместо этого DrawerLayout получает все сенсорные события. Нажатие на любой элемент в DrawerLayout приводит к закрытию DrawerLayout (что, я думаю, является методом onTouch по умолчанию в классе drawerlayout)

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <FrameLayout
        android:id="@+id/main_content"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@drawable/background" >
    <-- my main layouts here -->
    </FrameLayout>

    <LinearLayout
        android:id="@+id/left_linear"
        android:layout_width="fill_parent"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:clickable="true"
        android:orientation="vertical" >

        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:clickable="true"
            android:orientation="horizontal" >

            <EditText
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:background="@drawable/noborder"
                android:clickable="true"
                android:hint="search box 1"
                android:padding="8dp"
                android:singleLine="true" />

            <ImageView
                android:layout_width="40dp"
                android:layout_height="40dp"
                android:padding="5dp"
                android:src="@android:drawable/ic_menu_search" />
        </LinearLayout>

        <ListView
            android:id="@+id/left_drawer"
            android:layout_width="fill_parent"
            android:layout_height="match_parent"
            android:layout_gravity="start"
            android:background="#111"
            android:choiceMode="singleChoice"
            android:divider="@android:color/transparent"
            android:dividerHeight="0dp" />
    </LinearLayout>

</android.support.v4.widget.DrawerLayout>

person artouiros    schedule 16.03.2014    source источник
comment
Вы хотите, чтобы макет ящика оставался открытым, когда вы нажимаете на текст редактирования? или не открывать(когда он закрывался) при нажатии на edittext?   -  person meh    schedule 22.03.2014
comment
Вы используете в linearLayout gravity=start. За что?   -  person Sergey Shustikov    schedule 22.03.2014
comment
@meh Я хочу, чтобы drawerlayout оставался открытым, пока я нажимаю на EditText   -  person artouiros    schedule 22.03.2014
comment
хорошо, тогда я думаю, вам следует использовать что-то другое, называемое slidePaneLayout.   -  person meh    schedule 22.03.2014
comment
я пробую ваш xml-файл в пустом проекте, и все работает нормально.   -  person Sergey Shustikov    schedule 23.03.2014


Ответы (5)


Попробуйте drawerlayout.requestDisallowInterceptTouchEvent(true) в своем oncreate

person AnswerBot    schedule 22.03.2014
comment
Вы пробовали мое решение? - person AnswerBot; 24.03.2014

Установите как редактировать текст, так и текстовое представление явно как интерактивные.. затем реализовать что-то подобное для представления списка

    /******************************Listener for Drawer***************/
private class DrawerItemClickListener implements ListView.OnItemClickListener
{
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id)
    {
        //your code here based on posotion

    }   
}

вы можете установить слушателя, используя что-то вроде этого

     DrawerList.setOnItemClickListener(new DrawerItemClickListener());
person thenoob    schedule 25.03.2014

я обнаружил аналогичную проблему, у меня есть обновление sdk и особенно дополнительная папка, и все работает нормально.

Я проверил ваш код, и он отлично работает на моем устройстве.

Спасибо надеюсь поможет.

person Imtiyaz Khalani    schedule 28.03.2014

я сделал что-то вроде этого,

я обновил ваш код.

edittext теперь может принимать фокус

создать main.xml

<android.support.v4.widget.DrawerLayout
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@+id/drawer_layout"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
            <FrameLayout
                android:background="@drawable/background"
                android:id="@+id/main_content"
                android:layout_width="match_parent"
                android:layout_height="match_parent">
    <-- my main layouts here -->
    </FrameLayout>

  <FrameLayout
        android:id="@+id/navigation_frame"
        android:layout_width="280dp"
        android:layout_height="match_parent"
        android:layout_gravity="start" />

    </android.support.v4.widget.DrawerLayout>

создать файл navigation.xml

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/left_linear"
        android:layout_width="fill_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:clickable="true"
        android:layout_gravity="start">
        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:clickable="true"
            android:orientation="horizontal">
            <EditText
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:clickable="true"
                android:background="@drawable/noborder"
                android:hint="search box 1"
                android:padding="8dp"
                android:singleLine="true" />

            <ImageView
                android:layout_width="40dp"
                android:layout_height="40dp"
                android:padding="5dp"
                android:src="@android:drawable/ic_menu_search" />
        </LinearLayout>

            <ListView android:id="@+id/left_drawer"
                android:layout_width="fill_parent"
                android:layout_height="match_parent"
                android:layout_gravity="start"
                android:choiceMode="singleChoice"
                android:divider="@android:color/transparent"
                android:dividerHeight="0dp"
                android:background="#111"/>
            </LinearLayout>

//создать активность как

public class HomeActivity extends actionbaractivity
{
    @Override
    protected void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        // add menu to navigation drawer
        addMenu();
    }


    private void addMenu()
    {

        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager
                .beginTransaction();
        fragmentTransaction.replace(R.id.navigation_frame,
                new NavigationFragment());
        fragmentTransaction.commit();
    }
}

// создаем новый класс фрагмента, который добавляет меню в макет ящика

public class NavigationFragment extends Fragment 
{
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) 
    {
        View view=inflater.inflate(R.layout.navigation_view, null);
               return view;
    }
}

// у меня работает..

person Mahendra    schedule 26.03.2014

Попробуй это.

package com.example.drawersample;

import android.os.Bundle;
import android.app.Activity;
import android.content.res.Configuration;
import android.support.v4.app.ActionBarDrawerToggle;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {

    private String[] drawerListViewItems;
    private DrawerLayout drawerLayout;
    private ListView drawerListView;
    private ActionBarDrawerToggle actionBarDrawerToggle;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // get list items from strings.xml
        drawerListViewItems = getResources().getStringArray(R.array.items);
        // get ListView defined in activity_main.xml
        drawerListView = (ListView) findViewById(R.id.left_drawer);

        // Set the adapter for the list view
        drawerListView.setAdapter(new ArrayAdapter<String>(this,
                R.layout.drawerlist, drawerListViewItems));

        // 2. App Icon
        drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);

        // 2.1 create ActionBarDrawerToggle
        actionBarDrawerToggle = new ActionBarDrawerToggle(this, /* host Activity */
        drawerLayout, /* DrawerLayout object */
        R.drawable.ic_launcher, /* nav drawer icon to replace 'Up' caret */
        R.string.drawer_open, /* "open drawer" description */
        R.string.drawer_close /* "close drawer" description */
        );

        // 2.2 Set actionBarDrawerToggle as the DrawerListener
        drawerLayout.setDrawerListener(actionBarDrawerToggle);

        // 2.3 enable and show "up" arrow
        getActionBar().setDisplayHomeAsUpEnabled(true);

        // just styling option
        drawerLayout.setDrawerShadow(R.drawable.drawer_shadow,
                GravityCompat.START);

        drawerListView.setOnItemClickListener(new DrawerItemClickListener());
    }

    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
        // Sync the toggle state after onRestoreInstanceState has occurred.
        actionBarDrawerToggle.syncState();
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        actionBarDrawerToggle.onConfigurationChanged(newConfig);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        // call ActionBarDrawerToggle.onOptionsItemSelected(), if it returns
        // true
        // then it has handled the app icon touch event

        if (actionBarDrawerToggle.onOptionsItemSelected(item)) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    private class DrawerItemClickListener implements
            ListView.OnItemClickListener {
        @Override
        public void onItemClick(AdapterView parent, View view, int position,
                long id) {
            Toast.makeText(MainActivity.this, ((TextView) view).getText(),
                    Toast.LENGTH_LONG).show();
            drawerLayout.closeDrawer(drawerListView);

        }
    }
}

drawerlist.xml

<?xml version="1.0" encoding="utf-8"?>

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/text1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textColor="#fff"
    android:textSize="20sp"
    android:gravity="center_vertical"
    android:paddingStart="14.5sp"
    android:paddingEnd="14.5sp"
    android:minHeight="35sp"

/>

main.xml


<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <!-- The main content view -->
    <FrameLayout
        android:id="@+id/content_frame"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <!-- The navigation drawer -->
    <ListView android:id="@+id/left_drawer"
        android:layout_width="240dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:choiceMode="singleChoice"
        android:divider="#666"
        android:dividerHeight="1dp"
        android:background="#333"
        android:paddingLeft="15sp"
        android:paddingRight="15sp"
        />

</android.support.v4.widget.DrawerLayout>



strings.xml



<resources>

    <string name="app_name">DrawerSample</string>
    <string name="action_settings">Settings</string>
    <string name="hello_world">Hello world!</string>

    <string-array name="items">
        <item>Item 1</item>
        <item>Item 2</item>
        <item>Item 3</item>
        <item>Item 4</item>
        <item>Item 5</item>
        <item>Item 6</item>
    </string-array>

    <string name="drawer_open">Open navigation drawer</string>
    <string name="drawer_close">Close navigation drawer</string>
</resources>

Try to add your Edittext and textview of the layout in below lines

    android:focusableInTouchMode="true"
    android:focusable="true"
  or 
 oncreate methos you use requestfocus(your element id);

thank you.
person Sethu    schedule 29.03.2014