2012-08-09 29 views
0

我是新來的Android,並試圖瞭解複合視圖的概念,如果android。我不確定我的下面的實現是否實用,但它是爲了學習的目的,我從Wrox Android書中獲得了這個想法。所以,我有三個組件,即一個按鈕,一個編輯文本和一個列表視圖。編輯文本的目的是編寫一些文本,而列表獲得文本更新並且按鈕是清除按鈕,並且假定清除編輯文本。我打算做的是保持清除按鈕並編輯一個視圖組中的文本。在它下面是java和xml代碼。如何實現複合視圖(android.view.InflateException錯誤)

public class CompoundView extends LinearLayout { 

EditText editText; 
Button clearButton; 

public CompoundView (Context context, AttributeSet attr) { 
    super(context, attr); 
    String infService = Context.LAYOUT_INFLATER_SERVICE; 
    LayoutInflater li; 

    li = (LayoutInflater)getContext().getSystemService(infService); 
    li.inflate(R.layout.clearable_edit_text, this, true); 

    editText = (EditText) findViewById(R.id.editText); 
    clearButton = (Button) findViewById(R.id.clearButton); 

    hookUpButton(); 
} 

public void hookUpButton() { 

    clearButton.setOnClickListener(new Button.OnClickListener() { 
     public void onClick (View v) { 
      editText.setText (""); 

     } 
    }); 
} 

public EditText getEditText() { 
    return this.editText; 
} 

} 

XML

<?xml version="1.0" encoding="utf-8"?> 
<merge xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="horizontal" 
android:layout_width="match_parent" 
android:layout_height="wrap_content"> 
<EditText 
    android:id="@+id/editText" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    /> 
<Button 
    android:id="@+id/clearButton" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:text="Clear" 
    /> 
</merge> 

我有一個強烈的感覺,這種實現是罰款。在下一部分我有MainActivity.java和activity_main.xml。在這個我面臨的問題,我很可能做錯了一些事情。

public class MainActivity extends Activity { 

@SuppressLint({ "ParserError", "ParserError" }) 
public class MainActivity extends Activity { 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    ListView myListView = (ListView)findViewById(R.id.myListView); 

    final CompoundView textAndClear = (CompoundView) findViewById(R.id.myEditAndClear) ; 
    final EditText editText = textAndClear.getEditText(); 
    final ArrayList<String> toDoItems = new ArrayList<String>(); 

    final ArrayAdapter<String> aa; 
    int resId = R.layout.todolist_item; 
    aa= new ArrayAdapter<String> (this, resId, toDoItems); 
    myListView.setAdapter(aa); 

    editText.setOnKeyListener(new View.OnKeyListener() { 

     public boolean onKey(View v, int keyCode, KeyEvent event) { 
      if(event.getAction() == KeyEvent.ACTION_DOWN) 
       if ((keyCode == KeyEvent.ACTION_DOWN) || (keyCode == KeyEvent.KEYCODE_ENTER)){ 
        toDoItems.add(0,editText.getText().toString()); 
        aa.notifyDataSetChanged(); 
        editText.setText(""); 
        return true; 
       } 
      return false; 
     } 
    }); 
    } 
} 

和XML

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:orientation="vertical" 
android:layout_width="match_parent" 
android:layout_height="match_parent" > 

<com.example.wroxexample.CompoundView 
    android:id="@+id/myClearableEditText" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    /> 
<ListView 
    android:id="@+id/myListView" 
    android:layout_below="@+id/myEditText" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"/> 
</RelativeLayout> 

,誤差

06-29 06:32:11.783: E/AndroidRuntime(5413): FATAL EXCEPTION: main 
06-29 06:32:11.783: E/AndroidRuntime(5413): java.lang.RuntimeException: Unable to start  activity ComponentInfo{com.example.wroxexample/com.example.wroxexample.MainActivity}: android.view.InflateException: Binary XML file line #8: Error inflating class com.example.wroxexmple.CompoundView 
06-29 06:32:11.783: E/AndroidRuntime(5413):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956) 
06-29 06:32:11.783: E/AndroidRuntime(5413):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981) 
06-29 06:32:11.783: E/AndroidRuntime(5413):  at android.app.ActivityThread.access$600(ActivityThread.java:123) 
06-29 06:32:11.783: E/AndroidRuntime(5413):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147) 
06-29 06:32:11.783: E/AndroidRuntime(5413):  at android.os.Handler.dispatchMessage(Handler.java:99) 
06-29 06:32:11.783: E/AndroidRuntime(5413):  at android.os.Looper.loop(Looper.java:137) 
06-29 06:32:11.783: E/AndroidRuntime(5413):  at android.app.ActivityThread.main(ActivityThread.java:4424) 
06-29 06:32:11.783: E/AndroidRuntime(5413):  at java.lang.reflect.Method.invokeNative(Native Method) 
06-29 06:32:11.783: E/AndroidRuntime(5413):  at java.lang.reflect.Method.invoke(Method.java:511) 
06-29 06:32:11.783: E/AndroidRuntime(5413):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
06-29 06:32:11.783: E/AndroidRuntime(5413):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
06-29 06:32:11.783: E/AndroidRuntime(5413):  at dalvik.system.NativeStart.main(Native Method) 
06-29 06:32:11.783: E/AndroidRuntime(5413): Caused by: android.view.InflateException: Binary XML file line #8: Error inflating class com.example.wroxexmple.CompoundView 
06-29 06:32:11.783: E/AndroidRuntime(5413):  at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:691) 
06-29 06:32:11.783: E/AndroidRuntime(5413):  at android.view.LayoutInflater.rInflate(LayoutInflater.java:739) 
06-29 06:32:11.783: E/AndroidRuntime(5413):  at android.view.LayoutInflater.inflate(LayoutInflater.java:489) 
06-29 06:32:11.783: E/AndroidRuntime(5413):  at android.view.LayoutInflater.inflate(LayoutInflater.java:396) 
06-29 06:32:11.783: E/AndroidRuntime(5413):  at android.view.LayoutInflater.inflate(LayoutInflater.java:352) 
06-29 06:32:11.783: E/AndroidRuntime(5413):  at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:251) 
06-29 06:32:11.783: E/AndroidRuntime(5413):  at android.app.Activity.setContentView(Activity.java:1835) 
06-29 06:32:11.783: E/AndroidRuntime(5413):  at com.example.wroxexample.MainActivity.onCreate(MainActivity.java:20) 
06-29 06:32:11.783: E/AndroidRuntime(5413):  at android.app.Activity.performCreate(Activity.java:4465) 
06-29 06:32:11.783: E/AndroidRuntime(5413):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049) 
06-29 06:32:11.783: E/AndroidRuntime(5413):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920) 
06-29 06:32:11.783: E/AndroidRuntime(5413):  ... 11 more 
06-29 06:32:11.783: E/AndroidRuntime(5413): Caused by: java.lang.ClassNotFoundException: com.example.wroxexmple.CompoundView 
06-29 06:32:11.783: E/AndroidRuntime(5413):  at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:61) 
06-29 06:32:11.783: E/AndroidRuntime(5413):  at java.lang.ClassLoader.loadClass(ClassLoader.java:501) 
06-29 06:32:11.783: E/AndroidRuntime(5413):  at java.lang.ClassLoader.loadClass(ClassLoader.java:461) 
06-29 06:32:11.783: E/AndroidRuntime(5413):  at android.view.LayoutInflater.createView(LayoutInflater.java:552) 
06-29 06:32:11.783: E/AndroidRuntime(5413):  at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:680) 
06-29 06:32:11.783: E/AndroidRuntime(5413):  ... 21 more 

回答

1

下面你貼應該是例外的真正原因的錯誤。我的猜測是,簡單看一下你的代碼,是因爲你只實現了一個構造函數,它需要一個Context(這個構造函數通常在你實例化代碼中的View時使用)。當您在xml佈局中使用複合視圖時,將使用也採用AttributeSet的構造函數(而不是您實現的僅需要Context的構造函數)。

另外,作爲便箋,您可以在onCreate方法中搜索化合物View,然後將其轉換爲LinearLayout。在onKey回調中,您嘗試調用其上的getText()setText(),但未實現類LinearLayout的方法(您可能在自定義視圖中使用了這些方法,但如果將該視圖作爲LinearLayout投入使用,則方法將不可用) 。

此外,您可能還想閱讀merge標記,以改進您的化合物View的佈局。

+0

謝謝,我根據您的建議進行了一些更改,可以在上面的代碼中看到這些更改。但是我仍然有同樣的錯誤。這次我附上了一個長日誌。希望你能夠找到問題的一些線索 – LivingThing 2012-08-09 14:18:07

+1

@LivingThing Android找不到自定義的'View'類。日誌說這個包是'com.example.wroxexmple',而在佈局文件中你有包'com.example.wroxexample'(在第二種情況下有一個額外的'a')。該類必須在xml佈局中使用的包中找到,因此您有視圖的類? – Luksprog 2012-08-09 14:24:19

+0

謝謝,這是一個愚蠢的錯誤,現在我前進:) – LivingThing 2012-08-09 14:30:28