2016-07-13 8 views
1

私はLinearLayoutを持っていて、それは垂直に積み重なったTextViewです。親にクリックリスナーをアタッチして、クリックイベントをTextView(子ビューであるLinearLayout)のいずれかに伝播させたいとします。Androidから子どもへのクリックを伝える

私はクリックリスナーを個別のTextViewに添付して同じ結果を得ることができますが、それ以外はやりたいと思います。

私は

android:duplicateParentState="true" 

属性に出くわしたが、これはどちらかの問題を解決していないようです。子ビューが含まれている親のクリックイベントを消費するようにするには、どうすればよいですか。また、各テキストビューは異なるアクションを実行する必要があります。ここで

はレイアウトです:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/linear_layout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Text_1" 
     android:duplicateParentState="true" 
     android:layout_marginBottom="10dp"/> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:duplicateParentState="true" 
     android:text="Text_2" /> 

</LinearLayout> 

そして、ここでは活動です:

public class MainActivity extends AppCompatActivity { 

    LinearLayout mLinearLayout; 
    TextView mTextView1; 
    TextView mTextView2; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     mLinearLayout = (LinearLayout) findViewById(R.id.linear_layout); 
     mLinearLayout.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 

       Log.v("view",view.toString()); 
      } 
     }); 
    } 
} 

ログは常に親ビューを印刷します

V/view: android.widget.LinearLayout{3ea32ab0 V.E...C. ...PH... 0,0-1080,1533 #7f0c0050 app:id/linear_layout} 
    V/view: android.widget.LinearLayout{3ea32ab0 V.E...C. ...PH... 0,0-1080,1533 #7f0c0050 app:id/linear_layout} 

私は明らかにここで何かが欠けていますうまくいけば、解決策はビュースタックをナビゲートすることを伴わないことが望ましい。私は間違って何をしています、どのような助けが最も高く評価されるでしょう。

+0

クリックを伝播するのはどちらですか?アプリはどのように知っていますか? –

+0

「クリックされた」TextViewへ。それはまさに私が解決しようとしている問題です。 – user1841702

+3

なぜ個々のTextViewにonClick Listenerを設定したくないのですか? –

答えて

0

LinearLayoutにはsetOnTouchListenerを使用することができます。このOnTouchListenerの内部では、MotionEventのクリックを検出する必要があります(GestureDetectorが役に立ちます)。このイベントからx、y座標を取得し、TextViewの座標と比較することができます。あなたはクリックしたTextViewを検出することができます。
このようにして、あなたが望むことをすることができますが、それは複雑で、あなたはそれを避けることができると信じています。

+0

+彼はそれを避けるべきです –

関連する問題