2016-11-27 54 views
2

我有一個ListView的子視圖有長按聽衆設置。當長時間點擊子視圖時,會顯示一個對話框。爲什麼在對話框顯示時不會觸摸事件?

的問題是,如果用戶保持對話節目後,他們的手指按下那麼他們仍然可以滾動的ListView,即使ListView控件現在是對話的後面。經過調試,我發現,所有的觸摸事件(例如,ACTION_MOVEACTION_UP)都仍然在原來的窗口中接收,直到用戶終於擡起他們的手指。

這裏是一個簡短的重複的例子:

package foo; 

import android.app.Activity; 
import android.app.AlertDialog; 
import android.content.Context; 
import android.os.Bundle; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.ListView; 
import android.widget.TextView; 

public class MainActivity extends Activity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     ListView listView = new ListView(this); 
     listView.setAdapter(new FooAdapter()); 
     setContentView(listView); 
    } 
} 

class FooAdapter extends BaseAdapter { 
    @Override 
    public int getCount() { 
     return 100; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     final Context context = parent.getContext(); 

     TextView textView = new TextView(context); 
     textView.setText("Text"); 
     textView.setOnLongClickListener(new View.OnLongClickListener() { 
      @Override 
      public boolean onLongClick(View view) { 
       new AlertDialog.Builder(context) 
        .setMessage("Hi") 
        .show(); 
       return true; 
      } 
     }); 

     return textView; 
    } 

    @Override 
    public Object getItem(int position) { 
     return null; 
    } 

    @Override 
    public long getItemId(int position) { 
     return 0; 
    } 
} 

在Android 6.0,7.0,7.1,ListView控件仍然是滾動甚至在對話獲得焦點,如果用戶不會放手孩子的看法。這似乎只在對話框第一次顯示時發生(直到再次創建活動)。

我有兩個問題:

  1. 這是一個Android的bug?發生了什麼事是,觸摸手勢運行完成(從ACTION_DOWNACTION_UP),即使窗口失去ACTION_UP以前集中。我無法想象這永遠是可取的行爲。

  2. 這裏有什麼最好的解決辦法?下面的解決方案(忽略所有的觸摸事件窗口失去焦點後)的作品,但我不知道是否有更好的東西:

    public class MainActivity extends Activity { 
        ... 
    
        @Override 
        public void dispatchTouchEvent(MotionEvent event) { 
         if (hasWindowFocus()) { 
          return super.dispatchTouchEvent(event); 
         } else { 
          return true; // suppress 
         } 
        } 
    } 
    

    請注意,我不能使用AbsListView.setOnItemLongClickListener,它忽略後,所有觸摸事件,解決了這個問題已經檢測到長時間點擊,因爲它太不靈活了。

+0

嘗試調用'setCancelable(假)'在'AlertDialog .Builder'實例。 – Emmanuel

+0

@Emmanuel使用'setCancelable(false)'時出現同樣的問題。 –

+0

您是否設法找到解決方案? –

回答

0

我不知道事件的方式在Android上工作。 在我看來,當你點擊屏幕,根據你的座標,android會指定查看這個事件的過程。因爲用戶還沒有發佈滾動視圖事件,所以這個視圖仍然被理解爲正在處理這個事件。

告訴你對話之前就解決listView.setEnable(真)。

最佳實踐,創建自定義對話框或util的創建與聽衆對話:

前戲 - >禁用的ListView 解僱前 - >啓用的ListView

相關問題