2010-08-15 4 views
16

ich meine eigene Tokenizer Basis auf die Datei „MultiAutoCompleteTextView.java“ implementieren möchten,Wie den Fehler beheben „com.android.internal.R kann nicht aufgelöst werden“, wenn ich die Android-Datei ‚MultiAutoCompleteTextView.java‘ verwenden,

aber ich ist ein Fehler aufgetreten „com.android.internal.R cannot be resolved“, wenn ich versuche zu

Import „MultiAutoCompleteTextView.java“ mein Projekt.

Code:

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

Ich habe keine Lösungen erforschen diese problem.How zu lösen zu korrigieren "com.android.internal.R.attr.autoCompleteTextViewStyle" my own attr?

Vielen Dank für Anregungen.

+0

Drücken Sie Strg + 0? – Techboy

+0

Kann die direkte 'MultiAutoCompleteTextView' nicht innerhalb des SDK verwendet werden, ohne sich selbst zu deklarieren? – rciovati

Antwort

0

Ich bin mir nicht sicher, ob Sie von internal importieren und referenzieren können. Als Workaround laden Sie die Referenzen von der Android-Quelle herunter, und binden Sie sie in Ihre eigenen Ressourcen ein, und beziehen Sie sich auf Ihr Paket.

+0

Vielen Dank für Ihre Antwort. Ich möchte einige Methoden in diesem Java-Profil zu meinen Methoden ändern und es in mein Projekt importieren. Aber ich kann den Fehler in diesem Satz nicht korrigieren "dies (Kontext, attrs, com.android.internal.R.attr.autoCompleteTextViewStyle) " – huaigu

+1

Haben Sie versucht, das' interne.Packet.R.attr.autoCompleteTextViewStyle' in das interne Paket umzuwandeln? – Pentium10

+0

Ich kann diese Datei nicht umschreiben und ich kann diese Datei nicht finden ... – huaigu

3

Versuchen Sie, den attr Eintrag von attrs.xml Kopieren:

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

eine res/values/attrs.xml Ihrer Anwendung hinzufügen und diese Zeile setzen dort. Schließlich aktualisieren Sie Ihren Code R aus dem Paket zu verweisen:

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

Credit inazaruk für dieses Verfahren.

11

Sie könnten

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

verwenden Sie nicht ids von com.android.internal.R bei der Kompilierung zugreifen können, aber Sie die definierten internen Ressourcen zur Laufzeit zugreifen können und die Ressource von Namen. Sie sollten wissen, dass dies langsamer ist als der direkte Zugriff und es gibt keine Garantie, dass eine interne Ressource in zukünftigen Versionen von Android oder in herstellerspezifischen Builds verfügbar sein wird.

+1

Dies würde nicht kompilieren, weil Aufrufe an diese() oder super() muss die erste Zeile in einem Konstruktor sein.Sie könnten jedoch die ID-Variable inline einfügen, dh: 'public MultiAutoCompleteTextView (Kontext Kontext, AttributSet attrs) { dies (Kontext, attrs, Resources.getSystem(). getIdentifier ("autoCompleteTextViewStyle", "attr", "android")); } ' – k2col

+0

Natürlich haben Sie Recht, ich modifizierte die Antwort, danke – yonojoy

1

Ja, Sie können das interne R mit Java-Reflektion verwenden.

autoCompleteTextViewStyle Um:

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

Wie gesagt, diese Art und Weise ist ein Hack, bietet in der Regel Android einen öffentlichen Stil ähnliche oder gleiche basierend auf android.R

+0

Reflexion verursacht Laufzeitstrafen. –

1

Dies funktioniert:

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); 

Sie müssen die gewünschte Variable auf die gleiche Weise angeben.

Verwandte Themen