Java Android-创建自定义复合组件

Java Android-创建自定义复合组件,java,android,android-custom-view,custom-component,custom-view,Java,Android,Android Custom View,Custom Component,Custom View,几周前我才开始用Android编程,在此之前我从未使用过oop(我有c方面的一些背景知识,微控制器的嵌入式c等),因此我可能会完全错误地理解这个想法,但我需要帮助才能继续: 我创建了一个示例活动,用作一个UI,它完全符合我的意图。在那之后,我想用它作为未来设计的定制化合物,所以我试着做些改变,但没想到。该化合物有3个文本视图和2个按钮。我还实现了在按钮旁边使用的手势(这样我可以上下滚动来更改值) 现在,当我使用这个自定义化合物时,我得到了一个错误。我不明白为什么 这里是我的复合布局 <Re

几周前我才开始用Android编程,在此之前我从未使用过oop(我有c方面的一些背景知识,微控制器的嵌入式c等),因此我可能会完全错误地理解这个想法,但我需要帮助才能继续:

我创建了一个示例活动,用作一个UI,它完全符合我的意图。在那之后,我想用它作为未来设计的定制化合物,所以我试着做些改变,但没想到。该化合物有3个文本视图和2个按钮。我还实现了在按钮旁边使用的手势(这样我可以上下滚动来更改值)

现在,当我使用这个自定义化合物时,我得到了一个错误。我不明白为什么

这里是我的复合布局

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/CustomTouchPickerLayout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
tools:context=".CustomTouchPickerActivity" >

<TextView
    android:id="@+id/textViewMid"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/textViewTop"
    android:clickable="true"
    android:focusable="true"
    android:focusableInTouchMode="true"
    android:onClick="onClickMid"
    android:paddingBottom="20sp"
    android:paddingTop="20sp"
    android:textSize="45sp" 
    android:text="Mid"
    android:layout_centerHorizontal="true"/>

<TextView
    android:id="@+id/textViewBot"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/textViewMid"
    android:textSize="22sp" 
    android:text="Bot"
    android:layout_centerHorizontal="true"/>

<TextView
    android:id="@+id/textViewTop"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/textViewBot"
    android:layout_marginTop="52dp"
    android:textSize="22sp" 
    android:text="Top"
    android:layout_centerHorizontal="true"/>

<Button
    android:id="@+id/buttonTop"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:onClick="OnClickButtonTop"
    android:text="Up" 
    android:layout_centerHorizontal="true"/>

<Button
    android:id="@+id/buttonBot"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/textViewBot"
    android:layout_centerHorizontal="true"
    android:onClick="OnClickButtonBot"
    android:text="Down" />
和android清单

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.vestel.customtouchpicker"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk
    android:minSdkVersion="11"
    android:targetSdkVersion="19" />

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name="com.vestel.customtouchpicker.MainActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

</manifest>

顺便说一句,如果您直接将代码用作活动,它就会工作(当然,我删除了一些行,如“setContentView”等

您在主活动布局中缺少类名。找不到类
com.vestel.customtouchpicker
,这只是自定义组件的包名,而不是类名。在主活动布局中,将完全限定的名称命名为
com.vestel.customtouchpicker.customtouchpicker
,它应该可以工作

改为:

<com.vestel.customtouchpicker.CustomTouchPicker
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
/>


编辑:这是ClassNotFoundException的答案,我没有检查您的所有代码。因此可能还有另一个问题。

我猜这个错误是由以下两行引起的:

LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.activity_custom_touch_picker,this);
因为context.getSystemService中的“context”可能正在引发异常。 也许你可以用

context.getApplicationContext().getSystemService

由于您试图在活动之外使用上下文

谢谢!您成功了:D我得到了另一个答案,但您给出的提示有效,但是,现在应用程序正在主活动中寻找“onClick”处理程序是否可以将其重新路由以使用其自己的回调函数?(正如我在问题中所写,我在customtouchpicker.java中处理onClick,而不是在MainActivity.java中处理onClick)
    04-04 14:41:59.049: E/Trace(31339): error opening trace file: No such file or directory (2)
04-04 14:41:59.319: E/AndroidRuntime(31339): FATAL EXCEPTION: main
04-04 14:41:59.319: E/AndroidRuntime(31339): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.vestel.customtouchpicker/com.vestel.customtouchpicker.MainActivity}: android.view.InflateException: Binary XML file line #12: Error inflating class com.vestel.customtouchpicker
04-04 14:41:59.319: E/AndroidRuntime(31339):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2351)
04-04 14:41:59.319: E/AndroidRuntime(31339):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
04-04 14:41:59.319: E/AndroidRuntime(31339):    at android.app.ActivityThread.access$600(ActivityThread.java:151)
04-04 14:41:59.319: E/AndroidRuntime(31339):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1331)
04-04 14:41:59.319: E/AndroidRuntime(31339):    at android.os.Handler.dispatchMessage(Handler.java:99)
04-04 14:41:59.319: E/AndroidRuntime(31339):    at android.os.Looper.loop(Looper.java:155)
04-04 14:41:59.319: E/AndroidRuntime(31339):    at android.app.ActivityThread.main(ActivityThread.java:5454)
04-04 14:41:59.319: E/AndroidRuntime(31339):    at java.lang.reflect.Method.invokeNative(Native Method)
04-04 14:41:59.319: E/AndroidRuntime(31339):    at java.lang.reflect.Method.invoke(Method.java:511)
04-04 14:41:59.319: E/AndroidRuntime(31339):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1029)
04-04 14:41:59.319: E/AndroidRuntime(31339):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:796)
04-04 14:41:59.319: E/AndroidRuntime(31339):    at dalvik.system.NativeStart.main(Native Method)
04-04 14:41:59.319: E/AndroidRuntime(31339): Caused by: android.view.InflateException: Binary XML file line #12: Error inflating class com.vestel.customtouchpicker
04-04 14:41:59.319: E/AndroidRuntime(31339):    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:698)
04-04 14:41:59.319: E/AndroidRuntime(31339):    at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
04-04 14:41:59.319: E/AndroidRuntime(31339):    at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
04-04 14:41:59.319: E/AndroidRuntime(31339):    at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
04-04 14:41:59.319: E/AndroidRuntime(31339):    at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
04-04 14:41:59.319: E/AndroidRuntime(31339):    at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:363)
04-04 14:41:59.319: E/AndroidRuntime(31339):    at android.app.Activity.setContentView(Activity.java:1912)
04-04 14:41:59.319: E/AndroidRuntime(31339):    at com.vestel.customtouchpicker.MainActivity.onCreate(MainActivity.java:12)
04-04 14:41:59.319: E/AndroidRuntime(31339):    at android.app.Activity.performCreate(Activity.java:5066)
04-04 14:41:59.319: E/AndroidRuntime(31339):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1101)
04-04 14:41:59.319: E/AndroidRuntime(31339):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2307)
04-04 14:41:59.319: E/AndroidRuntime(31339):    ... 11 more
04-04 14:41:59.319: E/AndroidRuntime(31339): Caused by: java.lang.ClassNotFoundException: com.vestel.customtouchpicker
04-04 14:41:59.319: E/AndroidRuntime(31339):    at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:61)
04-04 14:41:59.319: E/AndroidRuntime(31339):    at java.lang.ClassLoader.loadClass(ClassLoader.java:501)
04-04 14:41:59.319: E/AndroidRuntime(31339):    at java.lang.ClassLoader.loadClass(ClassLoader.java:461)
04-04 14:41:59.319: E/AndroidRuntime(31339):    at android.view.LayoutInflater.createView(LayoutInflater.java:552)
04-04 14:41:59.319: E/AndroidRuntime(31339):    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:687)
04-04 14:41:59.319: E/AndroidRuntime(31339):    ... 21 more
<com.vestel.customtouchpicker.CustomTouchPicker
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
/>
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.activity_custom_touch_picker,this);
context.getApplicationContext().getSystemService