2016-09-21 53 views
0

所以我有一个AsyncTask与RunOnUiThread交互更改UI元素并添加TableRows问题是在TableRows中的监听器。只有一个有效,但其他则不行。这是从我的代码听众不在OnUiThread工作

public class SearchAsync extends AsyncTask<String, String, String> { 
private Context mContext; 
private Activity mAct; 

@Override 
protected void onPreExecute() { 
    super.onPreExecute(); 

} 

public void mytask(Context context, Activity act) { 
    mContext = context; 
    mAct = act; 
} 

@Override 
protected String doInBackground(final String... arg0) { 
     String sc2 = "Alpha"; 

      mAct.runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        GridLayout gey = (GridLayout) mAct.findViewById(R.id.greylayout); 
        TableLayout tbly = (TableLayout) mAct.findViewById(R.id.listviewtable);{ 
          final TableRow tbro = new TableRow(mContext); 
          TextView tev = new TextView(mContext); 
          tbro.setBackground(mAct.getResources().getDrawable(R.drawable.mybgbg)); 
          tev.setTextColor(Color.WHITE); 
          tev.setText(sc2); 
          tbro.addView(tev); 
          tbro.setOnClickListener(new View.OnClickListener() { // this listener doesn't work. 
           public void onClick(View v) { 
           System.out.println("yey! it works"); 
           } 
           }); 

          tbro.setOnLongClickListener(new View.OnLongClickListener(){ // this listener doesn't work too. 
           @Override 
           public boolean onLongClick(View v){ 
            System.out.println("yey! it works too!"); 
            return true; 
           } 
          }); 
          tbro.setOnTouchListener(new View.OnTouchListener() { // this listener works perfectly. 
           @Override 
           public boolean onTouch(View v, MotionEvent event) { 
            if (event.getAction() == MotionEvent.ACTION_DOWN) { 
             tbro.setBackground(mAct.getResources().getDrawable(R.drawable.mybgi)); 
            } else if (event.getAction() == MotionEvent.ACTION_UP || event.getAction() == MotionEvent.ACTION_CANCEL) { 
             tbro.setBackground(mAct.getResources().getDrawable(R.drawable.mybgbg)); 
            } 
            return true; 
           } 
          }); 
          tbro.setId(R.id.layoutx1); 
          tbro.setLongClickable(true); 
          tbro.setClickable(true); 
          tbly.addView(tbro); 

         } 
        } 
       } 

       TableRow tete = (TableRow)mAct.findViewById(R.id.layoutx1); 

      }); 
     } 
     catch(JSONException e){ 
      Log.e(TAG, "Json parsing error: " + e.getMessage()); 
      ); 

     } 
    } 
    return null; 

} 

@Override 
protected void onPostExecute(String result) { 
    super.onPostExecute(null); 
    final String rslt; 
    rslt = result; 
    mAct.runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
      Toast toast = Toast.makeText(mContext, rslt, Toast.LENGTH_SHORT); 
      toast.show(); 
     } 
}); 

} 

因此,只有OnTouchListener作品简单,但别人不..我不知道为什么。 这只是runOnUiThread和runonmainthread中的一个问题。

我试过代码onPreExecute()方法和onPostExecute。没有用。

但在MainActivity它工作得很好。

感谢您阅读我的问题。

+0

tbro.setLongClickable(真); 和 tbro.setClickable(true); 之前听众..当我编辑代码在这里,我忘了他们 – Nasreddine

回答

0

发生这种情况是因为您从onClick()返回true,这表示系统已“消耗”了该事件。

View.OnTouchListener | Android Developers

触摸事件将click事件发生之前,因为ACTION_DOWN将触发触摸事件,但你需要有一个ACTION_UP也才能有一个点击事件。

当您从onTouch()返回true时,这会消耗触摸事件,从而阻止触发点击事件的ACTION_UP

作为一般指导,您不应该使用OnTouchListenerOnClickListener在一起。

它看起来像你使用OnTouchListener只能改变背景。 A StateListDrawable会更好。您可以设置背景一次,状态列表负责其余的护理:

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item 
     android:drawable="@drawable/mybgi" 
     android:state_pressed="true"/> 
    <item 
     android:drawable="@drawable/mybgbg"/> 
</selector> 

State List | Drawable Resources | Android Developers

+0

谢谢先生,你的答案完美的作品,结果远远超过我的预期,从我的代码! 你真棒。 – Nasreddine