2017-12-22 13 views
0

DrawerLayoutを使用しています。RecyclerViewをメニューとして使用しています。DrawerLayoutは、画面上で(保持)を押している間に少し表示しています

スワイプとボタンをクリックするだけでメニューが開閉されますが、問題は、メインレイアウトから何かを押したままにすると、引き出しがちょっと表示され、ボタンをクリックすることです失敗するでしょう。しかし、すばやく押すとクリックは機能します。

Btw私はAndroid用ユーザーではありません。これはシステムまたはAndroidのデフォルト動作か何かですか?ここで

は、私は明確ではないよ場合

enter image description here

そして、ここでは私のレイアウト

<android.support.v4.widget.DrawerLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    xmlns:app="http://schemas.android.com/apk/res-auto"> 

    <android.support.v7.widget.RecyclerView 
     ... 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     app:layoutManager="LinearLayoutManager" 
     ... /> 


    <android.support.v7.widget.RecyclerView 
     ... 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_gravity="start" 
     .../> 

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

あなたがボタンや画面上の任意の場所をクリックしたときにのみ起こっているの?それはよくある問題ですし、回避策があるかもしれません – Rainmaker

+0

@Rainmakerそれは画面のどこにでも起こります。私は現在、ジェスチャ検出器をオーバーライドして長押しを無効にする方法を検討しています。それが助けになるかどうかは分かりませんが、どんな助けもありがたいです! –

+0

ええ、私の考えは、長いクリックを無効にしてそこに置くことでしたmDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);次に、mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);それを再び有効にしたいとき – Rainmaker

答えて

0

OK最後にDrawerLayoutのサブクラスを作成してonInterceptTouchEventメソッドをオーバーライドしました。その考え方は、押し下げるとメニューを強制的に閉じることです。そうでなければロックを解除します。

ここでは、xmlファイルの元のdrawerlayoutを置き換えるサブクラスです。

public class CustomDrawer extends DrawerLayout { 
    public CustomDrawer(Context context) { 
     super(context); 
    } 

    public CustomDrawer(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
    } 

    public CustomDrawer(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    @Override 
    public boolean onInterceptTouchEvent(MotionEvent event) { 
     if (event.getAction() == MotionEvent.ACTION_DOWN) { 
      setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED); 
     } else { 
      setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED); 
     } 
     return super.onInterceptTouchEvent(event); 
    } 

} 

とレイアウト擬似コード

<...CustomDrawer 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 
    ... 
    ... 
</...CustomDrawer> 
0

のための擬似コードは、あなたがメニューを含む活性を有し、その後にすることができているデモですメニューを使用する必要がある残りのアクティビティはそのアクティビティを実装します。

たとえば、

BaseActivity - メニューを含む:リサイクラービューの

import android.app.ActivityOptions; 
import android.os.Bundle; 
import android.support.design.widget.NavigationView; 
import android.support.v4.widget.DrawerLayout; 
import android.support.v7.app.ActionBarDrawerToggle; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.Toolbar; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 

public class BaseActivity extends AppCompatActivity 
     implements NavigationView.OnNavigationItemSelectedListener { 

    public static DrawerLayout drawer; 

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

     Toolbar toolbar = findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 
     getSupportActionBar().setDisplayShowTitleEnabled(false); 

     drawer = findViewById(R.id.drawer_layout); 
     ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
       this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); 

     drawer.setDrawerListener(toggle); 
     toggle.syncState(); 

     NavigationView navigationView = findViewById(R.id.nav_view); 
     navigationView.setNavigationItemSelectedListener(this); 

    } 

    @Override 
    public void onBackPressed() { 
     DrawerLayout drawer = findViewById(R.id.drawer_layout); 
     if (drawer.isDrawerOpen(GravityCompat.START)) { 
      drawer.closeDrawer(GravityCompat.START); 
     } else { 
      super.onBackPressed(); 
     } 
    } 

    @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 
     int id = item.getItemId(); 

     switch (id) { 
      ....... 
     } 
     return super.onOptionsItemSelected(item); 
    } 

    @Override 
    public boolean onNavigationItemSelected(@NonNull MenuItem item) { 
     // Handle navigation view item clicks 
     Intent intent; 
     int id = item.getItemId(); 
     ActivityOptions options = 
       ActivityOptions.makeCustomAnimation(getApplicationContext(), R.anim.enter, R.anim.exit); 
     switch (id) { 
      .............. 

     } 

     DrawerLayout drawer = findViewById(R.id.drawer_layout); 
     drawer.closeDrawer(GravityCompat.START); 
     return true; 
    } 

} 

活動:あなたのレイアウトタグにあなたのレイアウトXMLで

public class YourActivity extends BaseActivity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    LayoutInflater inflater = (LayoutInflater) this 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    View contentView = inflater.inflate(R.layout.your_layout, null, false); 
    BaseActivity.drawer.addView(contentView, 0); 
    getSupportActionBar().setDisplayShowTitleEnabled(true); 

    // Lookup the recycler view in activity layout 
    RecyclerView recyclerView = findViewById(R.id.recyclerView); 

    // Initialize arrayList 
    ArrayList<....> arrayList= new ArrayList<>(); 

    // Create adapter 
    YourAdapter adapter = new CategoryAdapter(...); 

    // Attach the adapter to the recycler view 
    recyclerView.setAdapter(adapter); 

    //Populate the recycler view 
    adapter.addData(); 

    // Set layout manager to position the items 
    recyclerView.setLayoutManager(new GridLayoutManager(this, 2, 
      GridLayoutManager.VERTICAL, false)); 

} 

your_layout.xml

<?xml version="1.0" encoding="utf-8"?> 
<GridLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_marginStart="20dp" 
    android:layout_column="2"> 

    <android.support.v7.widget.RecyclerView 
     android:id="@+id/recyclerView" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 

</GridLayout> 
+0

あなたの提案は、引き出しレイアウト以外のいくつかのレイアウトを使用することです? –

+0

ええ、別のレイアウトを使用し、レイアウトリソースファイルがDrawer LayoutであるBaseActivityを持って、他のアクティビティをBaseActivityに拡張してください – programmer44

1

は、プロパティを追加しますクリック可能でフォーカス可能

<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context="com.project.wordsdict.main.views.AboutActivity" 
    android:focusable="true" 
    android:clickable="true"> 

は、その後のonCreateメソッドでは、あなたの活動に使用しているものは何でもレイアウトID

ConstraintLayout mLayout = findViewById(R.id.yourLayoutId); 
    mLayout.setOnLongClickListener(new View.OnLongClickListener() { 
       @Override 
       public boolean onLongClick(View view) { 

       mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKE‌​D_CLOSED); 
        return true; 
       } 
      }); 

mLayout.setOnTouchListener(new View.OnTouchListener() {   
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     switch(event.getAction()) { 
      case MotionEvent.ACTION_DOWN: 
       return false; 
      case MotionEvent.ACTION_UP: 
       mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOC‌​KED); 
       return true; 
     } 
     return false; 
    } 
}); 

P.Sを使用して、レイアウトを見つけます。最終的にはDrawerLayoutのバグとして動作することを望みます

+0

コードありがとうございます。 longClickListenerにも到達していません。私はDrawerLayoutのサブクラスを作成し、 'onInterceptTouchEvent'メソッドをオーバーライドすることでそれを行いました –

+0

偉大な人、私のコードは近くでしたが、そこにはありませんでした – Rainmaker

関連する問題