0

私はAndroidを初めて使用し、Androidの場合は複合ビューの概念を理解しようとしています。以下の実装が実用的かどうかはわかりませんが、これは学習目的であり、WroxAndroidの本からこのアイデアを取り入れました。つまり、ボタン、編集テキスト、リストビューの3つのコンポーネントがあります。テキストの編集の目的はテキストを書き込むことですが、リストはテキストで更新され、ボタンはクリアボタンであり、編集テキストをクリアすることを想定しています。私が計画しているのは、クリアボタンを保持し、1つのビューグループでテキストを編集することです。その下には、そのためのjavaおよびxmlコードがあります。

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
4

1 に答える 1

1

投稿したエラーの下に、例外の本当の原因があります。私の推測では、コードを簡単に見てみると、例外は、をとるコンストラクターのみを実装したという事実から来ているということですContext(このコンストラクターは通常、inコードをインスタンス化するときに使用さViewれます)。xmlレイアウトで複合ビューを使用するAttributeSetと、(のみを使用する実装したコンストラクターの代わりに)も使用するコンストラクターが使用されますContext

また、補足としてViewonCreateメソッドで化合物を検索し、それをにキャストしますLinearLayout。次に、コールバックで、クラスに実装されていないメソッドとその上でメソッドを呼び出そonKeyうとします(カスタムビューにある可能性がありますが、ビューをメソッドとしてキャストすると、メソッドは使用できなくなります)。getText()setText()LinearLayoutLinearLayout

mergeまた、コンパウンドのレイアウトを改善するためにタグを読むこともできますView

于 2012-08-09T05:55:32.457 に答える