Tôi muốn xác định các thuộc tính tùy chỉnh trong phân đoạn Android bằng XML (không sử dụng các tham số bổ sung bó) như declare-styleable
trong các điều khiển tùy chỉnh. Nhưng không có nhà thầu nào có tham số AttrSet, vậy có thể không? Tôi có thể chỉ ghi đè public void onInflate(android.app.Activity activity, android.util.AttributeSet attrs, android.os.Bundle savedInstanceState)
để nhận hỗ trợ thuộc tính không?Thuộc tính tùy chỉnh trong các đoạn Android
Trả lời
@Override
public void onInflate(Activity activity, AttributeSet attrs, Bundle savedInstanceState) {
super.onInflate(activity, attrs, savedInstanceState);
// Your code here to process the attributes
}
Liên kết cho Support4Demos được thay đổi hoặc có thể thay đổi để đăng giải pháp hoàn chỉnh. Nó đi từ đây.
Tạo attrs.xml tập tin trong res/values thư mục. Hoặc thêm nội dung bên dưới nếu tệp đã tồn tại.
<?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="MyFragment"> <attr name="my_string" format="string"/> <attr name="my_integer" format="integer"/> </declare-styleable>
Override các onInflate đại biểu của mảnh và đọc thuộc tính trong nó
/** * Parse attributes during inflation from a view hierarchy into the * arguments we handle. */ @Override public void onInflate(Activity activity, AttributeSet attrs, Bundle savedInstanceState) { super.onInflate(activity, attrs, savedInstanceState); Log.v(TAG,"onInflate called"); TypedArray a = activity.obtainStyledAttributes(attrs,R.styleable.MyFragment); CharSequence myString = a.getText(R.styleable.MyFragment_my_string); if(myString != null) { Log.v(TAG, "My String Received : " + myString.toString()); } int myInteger = a.getInt(R.styleable.AdFragment_my_integer, -1); if(myInteger != -1) { Log.v(TAG,"My Integer Received :" + myInteger); } a.recycle(); }
Vượt qua những thuộc tính trong file layout của bạn như sau. Chỉ cần một ví dụ
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="This is android activity" /> <fragment android:id="@+id/ad_fragment" android:name="com.yourapp.packagename.MyFragment" android:layout_width="fill_parent" android:layout_height="50dp" android:layout_alignParentBottom="true" app:my_string="Hello This is HardCoded String. Don't use me" app:my_integer="30" /> </RelativeLayout>
Thats tất cả. Đó là một giải pháp làm việc.
Trong khi thực hiện việc này nếu bạn thấy bất kỳ lỗi vùng tên nào trong xml. thử làm sạch dự án lặp đi lặp lại. Đôi khi điều này thật thảm hại nhưng nhật thực và đôi khi là hành vi phạm lỗi.
Hy vọng nó sẽ giúp những người khác :)
Cheers
Studio Android của tôi tiếp tục hiển thị các thuộc tính tùy chỉnh trong XML với gạch dưới màu đỏ cho biết có lỗi, nhưng toàn bộ dự án được xây dựng tốt. FYI cho một người có thể nghĩ rằng họ aint làm điều đó ngay khi nhìn vào những lỗi đó trong tệp bố cục của họ. – Pocha
bạn có thể sử dụng 'http: // schemas.android.com/apk/res-auto' thay vì xmlns: app =" http://schemas.android.com/apk/res/com.yourapp.packagename "để tự động - tên gói thay đổi. http://stackoverflow.com/questions/10448006/xml-namespace-declaration-auto-substitute-package-name –
OK Tôi đã bỏ lỡ điều đó trước đây. Nếu bạn, giống như tôi, hãy sao chép dán từ một vài địa điểm, chú ý và đảm bảo không gian tên khớp với nhau, ví dụ: ** xmlns: $ {NameSpace} ** và giống nhau trong thuộc tính ** $ {NameSpace} **: attribute = "..." – TacB0sS
Bắt lỗi khi biên dịch: '... \ ứng dụng \ res \ layout \ select_category.xml: 26: Lỗi: Không tìm thấy định danh tài nguyên cho thuộc tính 'showRadioButtons 'trong gói' com.companyX.projectY ' ... \ app \ res \ layout \ select_category.xml: 26: lỗi: Không tìm thấy định danh tài nguyên cho thuộc tính' highlightSelection 'trong gói' com.companyX.projectY ' .. . \ app \ res \ layout \ select_category.xml: 26: lỗi: Không tìm thấy mã định danh tài nguyên cho thuộc tính 'unselectedColor' trong gói 'com.companyX.projectY'' – Anton
không gian tên ứng dụng xml và khai báo kiểu được viết sửa ectly. có thể cung cấp cho họ, nếu cần – Anton