0

そのため、RunOnUiThread を使用して AsyncTask を使用して、対話的に UI 要素を変更し、TableRows を追加しました。問題は TableRows のリスナーにあります。1 つだけが機能しますが、他は機能しません。これは私のコードからの単純なものです

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 では問題なく動作します。

私の質問を読んでくれてありがとう。

4

1 に答える 1

0

これは、イベントを「消費」したことをシステムに示す trueから戻っているために発生しています。onClick()

View.OnTouchListener | Android デベロッパー

ACTION_DOWNがタッチ イベントをトリガーするため、タッチ イベントはクリック イベントの前に発生しますが、クリック イベントを発生させる前ACTION_UPに も必要です。

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

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

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>

州リスト | 描画可能なリソース | Android デベロッパー

于 2016-09-21T18:22:27.247 に答える