2010-08-15 8 views
16

Chcę zaimplementować moją własną bazę Tokenizer na pliku " MultiAutoCompleteTextView.java ",Jak rozwiązać problem "nie można rozpoznać pliku" com.android.internal.R "podczas korzystania z pliku Android" MultiAutoCompleteTextView.java ",

ale napotkać błąd „com.android.internal.R cannot be resolved” przy próbie

importowej „MultiAutoCompleteTextView.java” do mojego projektu.

Kod:

public class MultiAutoCompleteTextView extends AutoCompleteTextView { 
    private Tokenizer mTokenizer; 

    public MultiAutoCompleteTextView(Context context) { 
     this(context, null); 
    } 

    public MultiAutoCompleteTextView(Context context, AttributeSet attrs) { 
     this(context, attrs, com.android.internal.R.attr.autoCompleteTextViewStyle); 
    } 

    public MultiAutoCompleteTextView(Context context, AttributeSet attrs, int defStyle)  { 
     super(context, attrs, defStyle); 
    } 
    . 
    . 
    . 
} 

Nie badać żadnych rozwiązań, aby rozwiązać ten ProblematykaW do poprawiania „com.android.internal.R.attr.autoCompleteTextViewStyle” własną attr?

Dziękujemy za wszelkie sugestie.

+0

Spróbuj nacisnąć ctrl + 0? – Techboy

+0

Nie można użyć prostego widoku "MultiAutoCompleteTextView" w SDK bez zadeklarowania siebie? – rciovati

Odpowiedz

0

Nie jestem pewien, czy można importować i odwoływać się z internal. Jako obejście pobierz odniesienia ze źródła Androida i dołącz do własnych zasobów oraz odniesień z pakietu.

+0

Dziękuję za odpowiedź. Chcę zmienić niektóre metody w tym profilu java na moje metody i zaimportować je do mojego projektu. Ale nie mogę poprawić błędu w tym zdaniu "this (context, attrs, com.android.internal.R.attr.autoCompleteTextViewStyle) " – huaigu

+1

Czy próbowałeś przepisać do' com.android.R.attr.autoCompleteTextViewStyle', zdejmując pakiet wewnętrzny? – Pentium10

+0

Nie mogę przepisać tego pliku i nie mogę znaleźć tego pliku ... – huaigu

3

Spróbuj skopiować wpis attr z attrs.xml:

<attr name="autoCompleteTextViewStyle" format="reference" /> 

Dodaj res/values/attrs.xml do aplikacji i umieścić tę linię tam. Wreszcie, należy zaktualizować swój kod do odniesienia R z pakietem:

import com.your.package.R; 
... 
public MultiAutoCompleteTextView(Context context, AttributeSet attrs) { 
    this(context, attrs, R.attr.autoCompleteTextViewStyle); 
} 

kredytową do inazaruk dla tej procedury.

11

Można użyć

public MultiAutoCompleteTextView(Context context, AttributeSet attrs) { 
     this(context, attrs, 
     Resources.getSystem().getIdentifier("autoCompleteTextViewStyle", "attr", "android"); 
    } 

Nie można uzyskać dostępu identyfikatorów z com.android.internal.R w czasie kompilacji, ale można uzyskać dostęp do określonych zasobów wewnętrznych w czasie rzeczywistym i dostać się do zasobu według nazwy. Należy pamiętać, że jest to wolniejsze niż bezpośredni dostęp i nie ma gwarancji, że wewnętrzny zasób będzie dostępny w przyszłych wersjach Androida lub w kompilacjach specyficznych dla dostawcy.

+1

Nie skompilowałoby to, ponieważ wywołania tego() lub super() musi być pierwszym wierszem w konstruktorze. Można jednak wstawić zmienną id: 'public MultiAutoCompleteTextView (Kontekst kontekstowy, AttributeSet attrs) { to (kontekst, attrs, Resources.getSystem(). getIdentifier ("autoCompleteTextViewStyle", "attr", "android")); } ' – k2col

+0

Oczywiście masz rację, zmodyfikowałem odpowiedź, dzięki – yonojoy

1

Tak, możesz użyć wewnętrznego R z odbiciem Java.

Aby uzyskać autoCompleteTextViewStyle:

Class clasz = Class.forName("com.android.internal.R$attr") 
Field field = clasz.getDeclaredField("autoCompleteTextViewStyle"); 
field.setAccessible(true); 
int autoCompleteTextViewStyle= (int)field.get(null); 

Jak wspomniano wcześniej, w ten sposób jest hack, zwykle Android zapewnia styl publicznego podobna lub taka sama na podstawie android.R

+0

Odbicie powoduje kary czasu pracy. –

1

to działa:

int id = Resources.getSystem().getIdentifier("config_sms_capable", "bool", "android"); 
    Resources res = Resources.getSystem(); 
    boolean configSMSCapable = res.getBoolean(id); 
    TextView displayText = findViewById(R.id.displayText); 
    String configSMSCapableString = configSMSCapable ? "TRUE" : "FALSE"; 
    displayText.setText("config_sms_capable = " + configSMSCapableString); 

Musisz podać żądaną zmienną w ten sam sposób.

Powiązane problemy