Android: как использовать классы в другом файле

Я пытаюсь создать класс-обработчик для многих моих повторно используемых методов. У меня проблемы с подключением отдельного файла классов.

Может кто-нибудь сказать мне, что этот пример терпит неудачу или что нужно сделать, чтобы он работал?

ClassExampleActivity.java: пакет com.apollo.classexample;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;


public class ClassExampleActivity extends Activity {
    /** Called when the activity is first created. */

    TextView infotext;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);


        String infostring = "Main Activity Class\n";

        Myhandler mh = new Myhandler();
        infostring += mh.testmethod();

        // Trying to use the TextView widget from this MyHandler class
        // This works from the main class but fails in the MyHandler class
        TextView infotext = (TextView) findViewById(R.id.infotext);
        infotext.setText(infostring);
    }
}

Myhandler.java: пакет com.apollo.classexample;

import android.widget.TextView;
import android.app.Activity;

public class Myhandler extends Activity {

    public String testmethod(){
        String innermessage = "This is a message from the innerclass\n";
        System.out.println(innermessage);

            /* This is an important component that I would like to use in this class
             Commenting these lines out and the application doesn't crash.
             I'm trying to learn how to use the next two lines in this MyHandler 
             class which I'm trying to make portable and reusable for other
             projectes.
            */
        TextView infotext = (TextView) findViewById(R.id.infotext);
            infotext.setText(innermessage); 

            // Placed to show that the MyHandler class is actually accessed
        return innermessage;
    }

}

AndroidManifest.xml:

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

    <uses-sdk android:minSdkVersion="7" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:name=".ClassExampleActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

    </application>

</manifest>

При вызове testmethod() приложение для Android вылетает. Если я закомментирую это, он запустится и напечатает сообщение System.out.printlin() в LogCat.

LogCat:

03-20 17:03:42.783: I/System.out(654): This is a message from the innerclass
03-20 17:03:42.783: D/AndroidRuntime(654): Shutting down VM
03-20 17:03:42.803: W/dalvikvm(654): threadid=1: thread exiting with uncaught exception (group=0x40014760)
03-20 17:03:42.853: E/AndroidRuntime(654): FATAL EXCEPTION: main
03-20 17:03:42.853: E/AndroidRuntime(654): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.apollo.classexample/com.apollo.classexample.ClassExampleActivity}: java.lang.NullPointerException
03-20 17:03:42.853: E/AndroidRuntime(654):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1748)
03-20 17:03:42.853: E/AndroidRuntime(654):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1764)
03-20 17:03:42.853: E/AndroidRuntime(654):  at android.app.ActivityThread.access$1500(ActivityThread.java:122)
03-20 17:03:42.853: E/AndroidRuntime(654):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1002)
03-20 17:03:42.853: E/AndroidRuntime(654):  at android.os.Handler.dispatchMessage(Handler.java:99)
03-20 17:03:42.853: E/AndroidRuntime(654):  at android.os.Looper.loop(Looper.java:132)
03-20 17:03:42.853: E/AndroidRuntime(654):  at android.app.ActivityThread.main(ActivityThread.java:4025)
03-20 17:03:42.853: E/AndroidRuntime(654):  at java.lang.reflect.Method.invokeNative(Native Method)
03-20 17:03:42.853: E/AndroidRuntime(654):  at java.lang.reflect.Method.invoke(Method.java:491)
03-20 17:03:42.853: E/AndroidRuntime(654):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
03-20 17:03:42.853: E/AndroidRuntime(654):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
03-20 17:03:42.853: E/AndroidRuntime(654):  at dalvik.system.NativeStart.main(Native Method)
03-20 17:03:42.853: E/AndroidRuntime(654): Caused by: java.lang.NullPointerException
03-20 17:03:42.853: E/AndroidRuntime(654):  at android.app.Activity.findViewById(Activity.java:1744)
03-20 17:03:42.853: E/AndroidRuntime(654):  at com.apollo.classexample.MyHandler.testmethod(MyHandler.java:16)
03-20 17:03:42.853: E/AndroidRuntime(654):  at com.apollo.classexample.ClassExampleActivity.onCreate(ClassExampleActivity.java:23)
03-20 17:03:42.853: E/AndroidRuntime(654):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1048)
03-20 17:03:42.853: E/AndroidRuntime(654):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1712)
03-20 17:03:42.853: E/AndroidRuntime(654):  ... 11 more

5 ответов

  1. Измените имя myhandler на "MyHandler", это звучит хорошо..
  2. В данной ситуации вам не нужно расширять класс Activity в MyHandler.
  3. Вы устанавливаете текстовое значение дважды, удаляете следующие строки из testmethod, они не нужны их..

TextView infotext = (TextView) findViewById (R.id.infotext);

    infotext.setText(innermessage); 

попробуйте обновить ваш вопрос, если вы получите ошибку....

РЕДАКТИРОВАТЬ

   //MyHandler.java
   public class Myhandler {

        public void testMethod(TextView txtView){
            String innermessage = "This is a message from the innerclass.";            
            txtView.setText(innerMessage); 

        }

    }

// ClassExampleActivity.java

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class ClassExampleActivity extends Activity {


    TextView infotext;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);


        String infostring = "Main Activity Class\n";
        TextView infotext = (TextView) findViewById(R.id.infotext);
        infotext.setText(infostring);

        Myhandler mh = new Myhandler();
        mh.testMethod(infoText);


    }
}

Это должно работать!

Я отвечу здесь, чтобы вы могли лучше увидеть мое объяснение.

В классе MyHandler вы делаете следующее:

TextView infotext = (TextView) findViewById(R.id.infotext);

Как вы можете видеть в справочнике Android:

публичный вид findViewById (int id)

С тех пор: Уровень API 1 Находит представление, идентифицированное атрибутом id из XML, который был обработан в onCreate(Bundle). Возвращает представление, если найдено или ноль в противном случае.

Как я понимаю, вы не обрабатывали XML в классе MyHandler, поэтому вы не можете взять TextView из XML, и он всегда равен нулю.

Надеюсь, это поможет.

Я могу работать с классами.. в Android

из-за тебя..

Большое спасибо за Вашу помощь.

Комментарий 1:

Вы должны заменить.. myhandler.. на.. MyHandler

Комментарий 2:

Вы должны скопировать-мимо.. блок.. (из AndroidManifest.xml)

    <activity
        android:name=".ClassExampleActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

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

и замените ".ClassExampleActivity" на ".MyHandler"

получить

    <activity
        android:name="pak.iceplanets.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>

    <activity
        android:name="pak.iceplanets.MyHandler"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

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

Комментарий 3

ClassExampleActivity.java.. и.. Myhandler.java

должен быть в.. той же папке..

(пример примера.. из папки.. apolo.. из папки.. com)

Вы можете заменить.. ".MyHandler" .. на "com.apollo.classexample.MyHandler"

Комментарий 4 Мои файлы

MyHandler.java .. и.. MainActivity.java

оба.. в папке.. iceplanets.. из папки.. пак

Комментарий 5 Содержание.. моего файла

MyHandler.java .. находится ниже

пакет пак.ицепланетс;

импорт android.app.Activity;

import android.widget.TextView;

открытый класс MyHandler расширяет Activity {

public void testMethod(TextView txtView){

    String innerMessage = "This is a message from the innerclass.";            

    txtView.setText(innerMessage); 
}

}

Комментарий 6

Потому что я использую Eclipse

Я автоматически.. пишу.. в папку.. activity_main.xml

Я получил строки

<TextView
    android:id="@+id/textView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"

    android:layout_centerHorizontal="true"
    android:text="Medium Text"
    android:textAppearance="?android:attr/textAppearanceMedium" />

Комментарий 7 Использовать (класс) MyHandler

Я написал (.. в MainActivity.java)

линии..

MyHandler MH;

TextView infoText;

после линии

открытый класс MainActivity расширяет Activity {

...

Я также написал (.. в onCreate(Bundle saveInstanceState){)

линии

 // infoText .. is a reference to .. textView1       

 TextView infoText = (TextView) findViewById(R.id.textView1);      

 MyHandler mh = new MyHandler();

 mh.testMethod(infoText);

после.. строки.. setContentView (R.layout.activity_main);

.....

Мои части кода.. Я написал выше..

хорошо работает.. на моем компьютере.

успех

С наилучшими пожеланиями, Тонио

Вы не забыли добавить оба действия в свой AndroidManifest.xml? Это поймало меня более одного или двух раз.

Вы проверили, имеет ли инфотекст НУЛЬ?

Другие вопросы по тегам