简体   繁体   English

由于添加了布局,Android App崩溃了

[英]Android App crashes due to adding a layout

I have the following initialization in my java file: 我的java文件中有以下初始化:

Button btnCalc = (Button) findViewById(R.id.btnCalculate);
final Button btnClearWin = (Button) findViewById(R.id.btnClear);
final Button btnSaveTrip = (Button) findViewById(R.id.btnSave);
final EditText nameOfInf = (EditText)findViewById(R.id.etName);
final EditText tollAmount = (EditText)findViewById(R.id.etToll);
final EditText showLog = (EditText)findViewById(R.id.etShowLog);
showLog.setFocusable(false);

final View lineView = (View) findViewById(R.id.vwLine);
final TextView tvTotalLabel = (TextView) findViewById(R.id.tvTotal);
final TextView tvTotalAmountLabel = (TextView) findViewById(R.id.tvTotalAmount);

final TextView tvNameLabel = (TextView) findViewById(R.id.tvName);
final TextView tvTollLabel = (TextView) findViewById(R.id.tvToll);

final RadioGroup rgTypeOfInf = (RadioGroup) findViewById(R.id.rgType);
final RadioGroup rgTypeOfTrip = (RadioGroup) findViewById(R.id.rgTripType);

Originally everything was working fine until I moved some of the objects to a different layout which is no longer in main layout file and now my application FC when it's opening. 最初一切都运行良好,直到我将一些对象移动到不同的布局,不再在main布局文件中,现在我的应用程序FC打开时。

The following are in a different layout, result.xml . 以下是不同的布局, result.xml Do I have to initialize them separately? 我是否必须单独初始化它们?

final EditText showLog = (EditText)findViewById(R.id.etShowLog);
showLog.setFocusable(false);
final Button btnClearWin = (Button) findViewById(R.id.btnClear);
final Button btnSaveTrip = (Button) findViewById(R.id.btnSave);

When I comment out the above four lines, the application opens just fine. 当我注释掉上面四行时,应用程序打开就好了。

Logcat: logcat的:

07-25 10:27:27.955: E/AndroidRuntime(13791): FATAL EXCEPTION: main
07-25 10:27:27.955: E/AndroidRuntime(13791): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.test.testing/com.test.testing.MainActivity}: java.lang.NullPointerException
07-25 10:27:27.955: E/AndroidRuntime(13791):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2306)
07-25 10:27:27.955: E/AndroidRuntime(13791):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2356)
07-25 10:27:27.955: E/AndroidRuntime(13791):    at android.app.ActivityThread.access$600(ActivityThread.java:150)
07-25 10:27:27.955: E/AndroidRuntime(13791):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1244)
07-25 10:27:27.955: E/AndroidRuntime(13791):    at android.os.Handler.dispatchMessage(Handler.java:99)
07-25 10:27:27.955: E/AndroidRuntime(13791):    at android.os.Looper.loop(Looper.java:137)
07-25 10:27:27.955: E/AndroidRuntime(13791):    at android.app.ActivityThread.main(ActivityThread.java:5195)
07-25 10:27:27.955: E/AndroidRuntime(13791):    at java.lang.reflect.Method.invokeNative(Native Method)
07-25 10:27:27.955: E/AndroidRuntime(13791):    at java.lang.reflect.Method.invoke(Method.java:511)
07-25 10:27:27.955: E/AndroidRuntime(13791):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)
07-25 10:27:27.955: E/AndroidRuntime(13791):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562)
07-25 10:27:27.955: E/AndroidRuntime(13791):    at dalvik.system.NativeStart.main(Native Method)
07-25 10:27:27.955: E/AndroidRuntime(13791): Caused by: java.lang.NullPointerException
07-25 10:27:27.955: E/AndroidRuntime(13791):    at com.test.testing.MainActivity.onCreate(MainActivity.java:51)
07-25 10:27:27.955: E/AndroidRuntime(13791):    at android.app.Activity.performCreate(Activity.java:5104)
07-25 10:27:27.955: E/AndroidRuntime(13791):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
07-25 10:27:27.955: E/AndroidRuntime(13791):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2260)
07-25 10:27:27.955: E/AndroidRuntime(13791):    ... 11 more
07-25 10:27:27.963: W/ActivityManager(381):   Force finishing activity com.test.testing/.MainActivity
07-25 10:27:28.517: W/ActivityManager(381): Activity pause timeout for ActivityRecord{4163fe28 u0 com.test.testing/.MainActivity}
07-25 10:27:28.666: I/qtaguid(381): Failed write_ctrl(s 0 10116) res=-1 errno=1
07-25 10:27:28.666: W/NetworkManagementSocketTagger(381): setKernelCountSet(10116, 0) failed with errno -1
07-25 10:27:38.666: W/ActivityManager(381): Activity destroy timeout for ActivityRecord{4163fe28 u0 com.test.testing/.MainActivity}
07-25 10:28:00.166: D/dalvikvm(2069): GC_CONCURRENT freed 3198K, 52% free 13534K/27904K, paused 3ms+3ms, total 29ms
07-25 10:28:00.166: D/dalvikvm(2069): WAIT_FOR_CONCURRENT_GC blocked 23ms

If you want to use views from other layout other than the main layout then you need to inflate that layout. 如果要使用除主布局以外的其他布局的视图,则需要对该布局进行充气。 If you do not inflate and use its views directly it will give NPE 如果你不直接膨胀并使用它的观点,它将给NPE

Example Code: 示例代码:

LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
RelativeLayout mFrame = (RelativeLayout)inflater.inflate(R.layout.results, null);   
//Now you can use/reference its resources/views etc.
final EditText showLog = (EditText)mFrame.findViewById(R.id.etShowLog);
showLog.setFocusable(false);
final Button btnClearWin = (Button) mFrame.findViewById(R.id.btnClear);
final Button btnSaveTrip = (Button) mFrame.findViewById(R.id.btnSave);

What i saw from your code "maybe" only this code produces error: 我从你的代码中看到“也许”只有这段代码会产生错误:

showLog.setFocusable(false)

Try to check for null first before setting any value 在设置任何值之前,请先尝试检查null

if (showLog != null) showLog.setFocusable(false);

移动或重命名文件或资源后,必须清理并构建新引用的项目。

For an activty when you use setcontentview(layout). 对于使用setcontentview(布局)时的激活。 Only that xml layout view you can reference to your activity. 只有那个xml布局视图才能引用您的活动。 For other xml,you have to inflate that XML as a view. 对于其他xml,您必须将该XML作为视图进行膨胀。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM