2013-04-10 5 views
2

책과 예제를 따라 Android를 배우려고합니다. 프래그먼트가 포함 된 응용 프로그램을 구현하는 데 막혔습니다. 이 응용 프로그램은 새 항목을 삽입하는 EditText와이를 표시하는 목록을 포함하는 Todo 목록으로 작동해야합니다.인플레이션 중 응용 프로그램 충돌이 발생했습니다.

응용 프로그램을 시작할 때 주 활동에서 setContentView()에 문제가 발생하여 "불행히도 TodoList2가 중지되었습니다."라는 메시지가 나타납니다. 지원 라이브러리를 사용하고 API 레벨 11 이상을 컴파일하려고했지만 동일한 오류가 발생했습니다. 나는 충돌 후 볼 수있는 로그 캣 다음에

:

: 여기 내 주요 활동 XML (activity_main.xml)가

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

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

    <application 
     android:allowBackup="true" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
     <activity 
      android:name="it.aledev.todolist2.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> 

: 여기

E/AndroidRuntime(4185): FATAL EXCEPTION: main 
E/AndroidRuntime(4185): java.lang.RuntimeException: Unable to start activity  ComponentInfo{it.aledev.todolist2/it.aledev.todolist2.MainActivity}: android.view.InflateException: Binary XML file line #13: Error inflating class fragment 
E/AndroidRuntime(4185):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180) 
E/AndroidRuntime(4185):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230) 
E/AndroidRuntime(4185):  at android.app.ActivityThread.access$600(ActivityThread.java:141) 
E/AndroidRuntime(4185):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234) 
E/AndroidRuntime(4185):  at android.os.Handler.dispatchMessage(Handler.java:99) 
E/AndroidRuntime(4185):  at android.os.Looper.loop(Looper.java:137) 
E/AndroidRuntime(4185):  at android.app.ActivityThread.main(ActivityThread.java:5041) 
E/AndroidRuntime(4185):  at java.lang.reflect.Method.invokeNative(Native Method) 
E/AndroidRuntime(4185):  at java.lang.reflect.Method.invoke(Method.java:511) 
E/AndroidRuntime(4185):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
E/AndroidRuntime(4185):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
E/AndroidRuntime(4185):  at dalvik.system.NativeStart.main(Native Method) 
E/AndroidRuntime(4185): Caused by: android.view.InflateException: Binary XML file line #13: Error inflating class fragment 
E/AndroidRuntime(4185):  at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704) 
E/AndroidRuntime(4185):  at android.view.LayoutInflater.rInflate(LayoutInflater.java:746) 
E/AndroidRuntime(4185):  at android.view.LayoutInflater.inflate(LayoutInflater.java:489) 
E/AndroidRuntime(4185):  at android.view.LayoutInflater.inflate(LayoutInflater.java:396) 
E/AndroidRuntime(4185):  at android.view.LayoutInflater.inflate(LayoutInflater.java:352) 
E/AndroidRuntime(4185):  at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:270) 
E/AndroidRuntime(4185):  at android.app.Activity.setContentView(Activity.java:1881) 
E/AndroidRuntime(4185):  at it.aledev.todolist2.MainActivity.onCreate(MainActivity.java:18) 
E/AndroidRuntime(4185):  at android.app.Activity.performCreate(Activity.java:5104) 
E/AndroidRuntime(4185):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080) 
E/AndroidRuntime(4185):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144) 
E/AndroidRuntime(4185):  ... 11 more 
E/AndroidRuntime(4185): Caused by: java.lang.NullPointerException 
E/AndroidRuntime(4185):  at it.aledev.todolist2.NewItemFragment.onCreateView(NewItemFragment.java:19) 
E/AndroidRuntime(4185):  at android.app.Fragment.performCreateView(Fragment.java:1695) 
E/AndroidRuntime(4185):  at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:861) 
E/AndroidRuntime(4185):  at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1035) 
E/AndroidRuntime(4185):  at android.app.FragmentManagerImpl.addFragment(FragmentManager.java:1137) 
E/AndroidRuntime(4185):  at android.app.Activity.onCreateView(Activity.java:4717) 
E/AndroidRuntime(4185):  at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:680) 
E/AndroidRuntime(4185):  ... 21 more 

내 매니페스트입니다

<LinearLayout 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" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context=".MainActivity" 
    android:orientation="vertical" 
    > 

    <fragment 
     android:name="it.aledev.todolist2.NewItemFragment" 
     android:id="@+id/new_item_fragment" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     /> 

    <fragment 
     android:name="it.aledev.todolist2.ToDoListFragment" 
     android:id="@+id/todo_list_fragment" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content"   
     /> 

</LinearLayout> 

여기 EditText가 포함 된 조각의 XML이 있습니다.

<?xml version="1.0" encoding="utf-8"?> 
<EditText xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/myEditText" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:contentDescription="@string/add_item_content_decription" 
    > 


</EditText> 

힌트 속성이 지정되지 않았기 때문에 경고가 포함되어 있지만, 넣어도 문제가 해결되지 않습니다. 여기

는 MainActivity 코드 :

package it.aledev.todolist2; 

import java.util.ArrayList; 

import android.app.Activity; 
import android.app.FragmentManager; 
import android.os.Bundle; 
import android.view.Menu; 
import android.widget.ArrayAdapter; 

public class MainActivity extends Activity implements NewItemFragment.OnNewItemAddedListener{ 
    private ArrayAdapter<String> aa; 
    private ArrayList<String> todoItems; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     // Get references to the fragment manager 
     FragmentManager fm=getFragmentManager(); 
     ToDoListFragment todoListFragment=(ToDoListFragment)fm.findFragmentById(R.id.todo_list_fragment); 

     // Create the array list of to do items 
     todoItems=new ArrayList<String>(); 

     // Create the array adapter to bind the array to the ListView 
     aa=new ArrayAdapter<String>(this,android.R.id.list,todoItems); 

     // Bind the ArrayAdapter to the ListView 
     todoListFragment.setListAdapter(aa); 

    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

    @Override 
    public void onNewItemAdded(String newItem) { 
     // TODO Auto-generated method stub 
     todoItems.add(newItem); 
     aa.notifyDataSetChanged(); 

    } 

} 

내가 (된 setContentView에 전화를 도달 할 수있다)에서 onCreate (에서), 그러나 실행은 결코 코드의 다음 줄에 도달하지 않습니다.

여기 NewFragmentItem에 관한 코드가있다 :

package it.aledev.todolist2; 

import android.app.Activity; 
import android.app.Fragment; 
import android.os.Bundle; 
import android.view.KeyEvent; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.EditText; 

public class NewItemFragment extends Fragment { 
    private OnNewItemAddedListener onNewItemAddedListener; 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){ 
     super.onCreateView(inflater, container, savedInstanceState); 
     View view=inflater.inflate(R.layout.new_item_fragment, container, false); 
     final EditText myEditText=(EditText)getActivity().findViewById(R.id.myEditText); 
     myEditText.setOnKeyListener(new View.OnKeyListener(){ 

      @Override 
      public boolean onKey(View v, int keyCode, KeyEvent event) { 
       // TODO Auto-generated method stub 
       if(event.getAction()==KeyEvent.ACTION_DOWN){ 
        if((keyCode==KeyEvent.KEYCODE_DPAD_CENTER)|| 
          (keyCode==KeyEvent.KEYCODE_ENTER)){ 
         String newItem=myEditText.getText().toString(); 
         onNewItemAddedListener.onNewItemAdded(newItem); 
         myEditText.setText(""); 
         return true; 
        } 
       } 
       return false; 
      } 

     }); 


     return view; 
    } 

    @Override 
    public void onAttach(Activity activity){ 
     super.onAttach(activity); 

     try{ 
      onNewItemAddedListener=(OnNewItemAddedListener)activity; 
     } 
     catch(ClassCastException e){ 
      throw new ClassCastException(activity.toString()+" must implement OnNewItemAddedListener"); 
     } 
    } 

    public interface OnNewItemAddedListener{ 
     public void onNewItemAdded(String newItem); 
    } 
} 

내가 찾은 비슷한 문제 Google지도를 포함하는 응용 프로그램에서,하지만 난지도를 사용하지 않습니다. 모든 문제는 지원 라이브러리를 사용하지 않거나 에뮬레이터/장치에서 잘못된 API를 사용하는 것과 같은 incoherences에서 비롯된 것 같습니다. 대상 SDK가 17로 설정된 API 레벨 11 이상에 대해 컴파일 중입니다. 에뮬레이터에 대해 API 레벨 17을 설정했습니다.

나는 정말로 내 잘못을 이해하지 못합니다. 도움을 청합니다.

답변

5

당신은 그 글고 치기에 null 포인터 예외를 얻고있다

final EditText myEditText=(EditText)getActivity().findViewById(R.id.myEditText); 

final EditText myEditText=(EditText)view.findViewById(R.id.myEditText); 

로 변경합니다. 에 해당 편집 텍스트가있는 xml 파일을 부 풀릴 때 getActivity() 대신 view을 사용해야합니다. 그리고 drawable 폴더에 ic_launcher 이미지가 있는지 확인하십시오. 그리고 그것은 실수로 삭제되지 않았습니다. 희망이 도움이됩니다.

+0

또는 'onViewCreated()'에서 '바인딩'을 할 수 있습니다. –

+0

감사합니다. 그것은 완벽하게 작동합니다. – Ale

관련 문제