App强制关闭;无法实例化活动

问题描述:

我一直在研究和研究这个问题App强制关闭;无法实例化活动

  • 利布斯被标记为库
  • 活动是在清单

宣布这是我想出如此远,而且我一直在过去的一个小时里被卡住了。

有人请帮忙。

错误:

10-31 18:58:23.654: E/AndroidRuntime(398): FATAL EXCEPTION: main 
10-31 18:58:23.654: E/AndroidRuntime(398): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.mikenning.chemistrywizard/com.mikenning.chemistrywizard.EquationBalancer}: java.lang.NullPointerException 
10-31 18:58:23.654: E/AndroidRuntime(398): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1569) 
10-31 18:58:23.654: E/AndroidRuntime(398): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663) 
10-31 18:58:23.654: E/AndroidRuntime(398): at android.app.ActivityThread.access$1500(ActivityThread.java:117) 
10-31 18:58:23.654: E/AndroidRuntime(398): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931) 
10-31 18:58:23.654: E/AndroidRuntime(398): at android.os.Handler.dispatchMessage(Handler.java:99) 
10-31 18:58:23.654: E/AndroidRuntime(398): at android.os.Looper.loop(Looper.java:123) 
10-31 18:58:23.654: E/AndroidRuntime(398): at android.app.ActivityThread.main(ActivityThread.java:3683) 
10-31 18:58:23.654: E/AndroidRuntime(398): at java.lang.reflect.Method.invokeNative(Native Method) 
10-31 18:58:23.654: E/AndroidRuntime(398): at java.lang.reflect.Method.invoke(Method.java:507) 
10-31 18:58:23.654: E/AndroidRuntime(398): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
10-31 18:58:23.654: E/AndroidRuntime(398): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
10-31 18:58:23.654: E/AndroidRuntime(398): at dalvik.system.NativeStart.main(Native Method) 
10-31 18:58:23.654: E/AndroidRuntime(398): Caused by: java.lang.NullPointerException 
10-31 18:58:23.654: E/AndroidRuntime(398): at android.app.Activity.findViewById(Activity.java:1647) 
10-31 18:58:23.654: E/AndroidRuntime(398): at com.mikenning.chemistrywizard.EquationBalancer.<init>(EquationBalancer.java:13) 
10-31 18:58:23.654: E/AndroidRuntime(398): at java.lang.Class.newInstanceImpl(Native Method) 
10-31 18:58:23.654: E/AndroidRuntime(398): at java.lang.Class.newInstance(Class.java:1409) 
10-31 18:58:23.654: E/AndroidRuntime(398): at android.app.Instrumentation.newActivity(Instrumentation.java:1021) 
10-31 18:58:23.654: E/AndroidRuntime(398): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1561) 
10-31 18:58:23.654: E/AndroidRuntime(398): ... 11 more 

类文件:

public class EquationBalancer extends Activity { 

    HorizontalScrollView reactants; 

    EditText editText = new EditText(this); 

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

     reactants = (HorizontalScrollView) findViewById(R.id.reactants); 

     EditText reactantNumberField = (EditText) findViewById(R.id.reactantsNumber); 
     final int reactantNom = Integer.parseInt(reactantNumberField.getText().toString()); 

     Button ok = (Button) findViewById(R.id.reactantsNumberOk); 
     ok.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       for (int i = 1; i < reactantNom; i++) { 
        editText.setHint("compound"); 
        reactants.addView(editText); 
       } 
      } 
     }); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.balancelayout, menu); 
     return true; 
    } 

} 

Android清单:

<manifest 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.mikenning.chemistrywizard" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk 
     android:minSdkVersion="9" 
     android:targetSdkVersion="15" /> 

    <application 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" 
     android:screenOrientation="portrait" > 
     <activity 
      android:name="EquationBalancer" 
      android:label="@string/title_activity_equation_balancer" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

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

</manifest> 

的XML布局文件:

<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

    <TextView 
     android:id="@+id/reactantsHowMany" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:paddingTop="10dp" 
     android:text="@string/reactantsHowMany" 
     android:textSize="18dp" 
     android:layout_alignParentTop="true" 
     android:layout_centerHorizontal="true" /> 

    <EditText 
     android:id="@+id/reactantsNumber" 
     android:paddingTop="5dp" 
     android:layout_width="65dp" 
     android:layout_height="wrap_content" 
     android:layout_below="@id/reactantsHowMany" 
     android:layout_marginLeft="60dp" 
     android:inputType="number" 
     android:hint="e.g. 4" /> 

    <Button 
     android:id="@+id/reactantsNumberOk" 
     android:paddingTop="5dp" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_below="@id/reactantsHowMany" 
     android:layout_alignParentRight="true" 
     android:layout_marginRight="60dp" 
     android:layout_alignBottom="@id/reactantsNumber" 
     android:text="Set" /> 

    <HorizontalScrollView 
     android:id="@+id/reactants" 
     android:paddingTop="5dp" 
     android:layout_width="match_parent" 
     android:layout_height="50dp" 
     android:layout_below="@id/reactantsNumber" > 

    </HorizontalScrollView> 

</RelativeLayout> 

更新的类文件(更新的每一个建议):

public class EquationBalancer extends Activity { 

    HorizontalScrollView reactants; 
    EditText reactantNumberField; 

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

     reactants = (HorizontalScrollView) findViewById(R.id.reactants); 

     final EditText editText = new EditText(this); 
     editText.setHint("compound"); 

     reactantNumberField = (EditText) findViewById(R.id.reactantsNumber); 


     Button ok = (Button) findViewById(R.id.reactantsNumberOk); 
     ok.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       int reactantNom = 0; 
       try{ 
        reactantNom = Integer.parseInt(reactantNumberField.getText().toString()); 
       } catch (NullPointerException e) { 
        //ignore error 
       } 
       if (reactantNom != 0) { 
        for (int i = 1; i < reactantNom; i++) { 
         try{ 
          reactants.addView(editText); 
         } catch (Exception e) { 
          //ignore 
         } 
        } 
       } else if (reactantNom == 1) { 
        try { 
         reactants.addView(editText); 
        } catch (Exception e) { 
         //ignore 
        } 
       } else { 
        Toast toast = Toast.makeText(EquationBalancer.this, "Please input the number of reactants", 
          Toast.LENGTH_SHORT); 
        toast.show(); 
       } 
      } 
     }); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.balancelayout, menu); 
     return true; 
    } 

} 
+0

在第13行中EquationBalancer什么? –

+0

@ soren.qvist; onCreate方法... – MiKenning

+0

在'onCreate'方法中移动'findViewById'('Button' +'Horizo​​ntalScrollView',也是'EditText'实例化)初始化。 – Luksprog

你的代码是无效的。此行:

Button ok = (Button) findViewById(R.id.reactantsNumberOk); 

是你的罪魁祸首。在您的观点被夸大之前,您初始化变量ok,因此oknull。您必须在setViewContent()方法后将ok = (Button) findViewById(R.id.reactantsNumberOk);移动到您的onCreate(),让findViewById()实际找到有用的东西。

这同样适用于下面几行:

final EditText reactantNumberField = (EditText) findViewById(R.id.reactantsNumber); 
final int reactantNom = Integer.parseInt(reactantNumberField.getText().toString()); 
HorizontalScrollView reactants = (HorizontalScrollView) findViewById(R.id.reactants); 

这些都是空的,一旦你解决上述ok初始化出于同样的原因您的应用程序仍然会崩溃。

在全球范围内对您的UI元素也没有任何要求。有效代码应如下所示:

public class EquationBalancer extends Activity { 

    HorizontalScrollView reactants; 

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

     EditText reactantNumberField = (EditText) findViewById(R.id.reactantsNumber); 
     int reactantNom = Integer.parseInt(reactantNumberField.getText().toString()); 

     reactants = (HorizontalScrollView) findViewById(R.id.reactants); 

     Button ok = (Button) findViewById(R.id.reactantsNumberOk);  
     ok.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       EditText editText; 
       for (int i=1; i < reactantNom; i++) { 
        editText = new EditText(this); 
        editText.setHint("compound"); 
        reactants.addView(editText); 
       } 
      } 
     }); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.balancelayout, menu); 
     return true; 
    } 
} 
+0

行“editText = new EditText(this);”是全球性的原因。除此之外,所有东西都已经被改变了,而且它仍然会关闭。 – MiKenning

+0

我在一个(完全毫无意义的)个人讨伐中。 “在全球范围内对你的用户界面元素没有任何要求。”将引用移至类字段不会使其成为全局的。 Global是应用范围广泛的。你正在谈论课堂级别范围。 – Simon

+0

是的,我的意思是课程级别的范围,但无论如何,没有任何事情像“应用程序范围”。应用程序只是一堆类。 –

在使用setContentView()膨胀根布局之前,不能在布局中设置对视图的引用。

final EditText reactantNumberField; 

然后在的onCreate,的setContentView()后

reactantNumberField = (EditText) findViewById(R.id.reactantsNumber); 
+0

仍然强制关闭,无论如何。将更新给定的代码来包含这一点。 – MiKenning

+0

请删除旧的代码和错误,并发布新的错误。你还应该阅读一些教程,特别是如何正确地创建一个活动。你的代码有很多问题。 – Simon

+0

现在没事了。我将粘贴最终的代码。 – MiKenning