2011-12-27 36 views
28

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

+0

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

+0

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

Trả lời

1
@Override 
public void onInflate(Activity activity, AttributeSet attrs, Bundle savedInstanceState) { 
    super.onInflate(activity, attrs, savedInstanceState); 
    // Your code here to process the attributes 
} 
+2

Hoạt động, nhưng hãy đảm bảo xóa các điểm đánh dấu Lint (Công cụ Android> Xóa dấu mốc). Tôi đã dành 10mn cố gắng tìm ra lý do tại sao nó không được xây dựng! – tdevaux

+0

Cảm ơn tdevaux, tôi chỉ dành 5 phút trước khi đọc lại. Tôi có thêm 5 phút nữa trong cuộc đời tôi! – dhaag23

71

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.

  1. 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> 
    

  2. 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(); 
    } 
    
  3. 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

+2

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

+1

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 –

+0

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

Các vấn đề liên quan