2016-09-21 52 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