ในแอปพลิเคชันฉันกำลังทำงานอยู่ฉันต้องสร้าง LinearLayout แบบไดนามิก ในกรณีนี้คำสั่ง
ll.setClickable(true);
ไม่ทำงานตามที่ควรจะทำ แม้ว่าฉันอาจพลาดบางอย่าง แต่ฉันก็สามารถใช้ประโยชน์จาก setOnTouchListener เพื่อให้ได้ผลลัพธ์เดียวกันและฉันส่งรหัสในกรณีที่มีใครต้องการเหมือนกัน
โค้ดต่อไปนี้จะสร้าง LinearLayout ที่มีมุมมองข้อความสองแบบและมุมกลมเปลี่ยนสีเมื่อกด
ขั้นแรกสร้างไฟล์ xml สองไฟล์ในโฟลเดอร์ที่วาดได้หนึ่งไฟล์สำหรับปกติและอีกไฟล์หนึ่งสำหรับสถานะ linearlayout ที่กด
xml สถานะปกติ (drawable / rounded_edges_normal.xml)
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="rectangle">
<solid android:color="#FFFFFF" />
<corners android:radius="7dp" />
<padding android:left="5dip" android:top="5dip" android:right="5dip" android:bottom="5dip" />
</shape>
</item>
<item android:bottom="3px">
<shape android:shape="rectangle">
<solid android:color="#F1F1F1" />
<corners android:radius="7dp" />
</shape>
</item>
</layer-list>
สถานะกด xml (drawable / rounded_edges_pressed.xml) ความแตกต่างเพียงอย่างเดียวคือสี ...
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="rectangle">
<solid android:color="#FFFFFF" />
<corners android:radius="7dp" />
<padding android:left="5dip" android:top="5dip" android:right="5dip" android:bottom="5dip" />
</shape>
</item>
<item android:bottom="3px">
<shape android:shape="rectangle">
<solid android:color="#add8e6" />
<corners android:radius="7dp" />
</shape>
</item>
</layer-list>
จากนั้นรหัสต่อไปนี้จะทำงาน
ตัวแปรส่วนกลาง:
public int layoutpressed = -1;
ในonCreate()
:
// Create some textviews to put into the linear layout...
TextView tv1 = new TextView(this);
TextView tv2 = new TextView(this);
tv1.setText("First Line");
tv2.setText("Second Line");
// LinearLayout definition and some layout properties...
final LinearLayout ll = new LinearLayout(context);
ll.setOrientation(LinearLayout.VERTICAL);
// it is supposed that the linear layout will be in a table.
// if this is not the case for you change next line appropriately...
ll.setLayoutParams(new TableRow.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
ll.setBackgroundResource(R.drawable.rounded_edges_normal);
ll.addView(tv1);
ll.addView(tv2);
ll.setPadding(10, 10, 10, 10);
// Now define the three button cases
ll.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View arg0, MotionEvent arg1) {
if (arg1.getAction()==MotionEvent.ACTION_DOWN){
ll.setBackgroundResource(R.drawable.rounded_edges_pressed);
ll.setPadding(10, 10, 10, 10);
layoutpressed = arg0.getId();
}
else if (arg1.getAction()== MotionEvent.ACTION_UP){
ll.setBackgroundResource(R.drawable.rounded_edges_normal);
ll.setPadding(10, 10, 10, 10);
if(layoutpressed == arg0.getId()){
// ...........................................................................
// Code to execute when LinearLayout is pressed...
// ...........................................................................
}
}
else{
ll.setBackgroundResource(R.drawable.rounded_edges_showtmimata);
ll.setPadding(10, 10, 10, 10);
layoutpressed = -1;
}
return true;
}
});