2016-09-21 1 views
0

私はRunOnUiThreadでAsyncTaskを使用して対話的にui要素を変更し、TableRowsを追加しました。問題はTableRowsのリスナーにあります。 1つだけは動作しますが、他は動作しません。これは私のコードリスナーは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

これは、trueonClick()から返すため、イベントが「消費された」ことをシステムに示しています。

View.OnTouchListener | Android Developers

ACTION_DOWNは、タッチイベントをトリガーするため、タッチイベントは、クリックイベントの前に起こるだろうが、あなたはクリックイベントを持つことができます前にもACTION_UPを持っている必要があります。

onTouch()からtrueを返すと、これによってタッチイベントが消費され、ACTION_UPがクリックイベントをトリガーしなくなります。

一般的なガイドラインとして、OnTouchListenerOnClickListenerを一緒に使用しないでください。

背景を変更する場合にのみOnTouchListenerを使用しているようです。 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

関連する問題