2016-08-19 5 views
-2

나는 프래그먼트로 연습하고 있으며,이 과정을 익히기 위해 테스터를 만들었습니다.조각으로 작업하기 :`클래스 조각을 부 풀리는 중 오류 '

내 목표는 10 개의 문자열로 구성된 ListView가있는 간단한 앱을 만드는 것입니다. ListView는 MainActivity 내의 조각에 포함됩니다.

그러나, 나는 오류로 실행 한

...

FATAL EXCEPTION: main 
    Process: com.example.frank.listview_test, PID: 5819 
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.frank.listview_test/com.example.frank.listview_test.MainActivity}: android.view.InflateException: Binary XML file line #14: Binary XML file line #14: Error inflating class fragment 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3253) 
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3349) 
     at android.app.ActivityThread.access$1100(ActivityThread.java:221) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794) 
     at android.os.Handler.dispatchMessage(Handler.java:102) 
     at android.os.Looper.loop(Looper.java:158) 
     at android.app.ActivityThread.main(ActivityThread.java:7224) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 
    Caused by: android.view.InflateException: Binary XML file line #14: Binary XML file line #14: Error inflating class fragment 
     at android.view.LayoutInflater.inflate(LayoutInflater.java:551) 
     at android.view.LayoutInflater.inflate(LayoutInflater.java:429) 
     at android.view.LayoutInflater.inflate(LayoutInflater.java:380) 
     at android.support.v7.app.AppCompatDelegateImplV9.setContentView(AppCompatDelegateImplV9.java:284) 
     at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:140) 
     at com.example.frank.listview_test.MainActivity.onCreate(MainActivity.java:17) 
     at android.app.Activity.performCreate(Activity.java:6876) 
     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1135) 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3206) 
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3349)  
     at android.app.ActivityThread.access$1100(ActivityThread.java:221)  
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794)  
     at android.os.Handler.dispatchMessage(Handler.java:102)  
     at android.os.Looper.loop(Looper.java:158)  
     at android.app.ActivityThread.main(ActivityThread.java:7224)  
     at java.lang.reflect.Method.invoke(Native Method)  
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)  
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)  
    Caused by: android.view.InflateException: Binary XML file line #14: Error inflating class fragment 
     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:794) 
     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:716) 
     at android.view.LayoutInflater.rInflate(LayoutInflater.java:847) 
     at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:810) 
     at android.view.LayoutInflater.inflate(LayoutInflater.java:527) 
     at android.view.LayoutInflater.inflate(LayoutInflater.java:429)  
     at android.view.LayoutInflater.inflate(LayoutInflater.java:380)  
     at android.support.v7.app.AppCompatDelegateImplV9.setContentView(AppCompatDelegateImplV9.java:284)  
     at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:140)  
     at com.example.frank.listview_test.MainActivity.onCreate(MainActivity.java:17)  
     at android.app.Activity.performCreate(Activity.java:6876)  
     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1135)  
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3206)  
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3349)  
     at android.app.ActivityThread.access$1100(ActivityThread.java:221)  
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794)  
     at android.os.Handler.dispatchMessage(Handler.java:102)  
     at android.os.Looper.loop(Looper.java:158)  
     at android.app.ActivityThread.main(ActivityThread.java:7224)  
     at java.lang.reflect.Method.invoke(Native Method)  
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)  
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)  
    Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ListView.setAdapter(android.widget.ListAdapter)' on a null object reference 
     at com.example.frank.listview_test.MainActivity$TestListFragment.onCreateView(MainActivity.java:37) 
     at android.app.Fragment.performCreateView(Fragment.java:2281) 
     at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:954) 
     at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1141) 
     at android.app.FragmentManagerImpl.addFragment(FragmentManager.java:1245) 
     at android.app.FragmentManagerImpl.onCreateView(FragmentManager.java:2218) 
     at android.app.FragmentController.onCreateView(FragmentController.java:98) 
     at android.app.Activity.onCreateView(Activity.java:6070) 
     at android.support.v4.app.BaseFragmentActivityHoneycomb.onCreateView(BaseFragmentActivityHoneycomb.java:36) 
     at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:75) 
     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:766) 
     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:716)  
     at android.view.LayoutInflater.rInflate(LayoutInflater.java:847)  
     at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:810)  
     at android.view.LayoutInflater.inflate(LayoutInflater.java:527)  
     at android.view.LayoutInflater.inflate(LayoutInflater.java:429)  
     at android.view.LayoutInflater.inflate(LayoutInflater.java:380)  
     at android.support.v7.app.AppCompatDelegateImplV9.setContentView(AppCompatDelegateImplV9.java:284)  
     at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:140)  
     at com.example.frank.listview_test.MainActivity.onCreate(MainActivity.java:17)  
     at android.app.Activity.performCreate(Activity.java:6876)  
     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1135)  
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3206)  
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3349)  
     at android.app.ActivityThread.access$1100(ActivityThread.java:221)  
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794)  
     at android.os.Handler.dispatchMessage(Handler.java:102)  
     at android.os.Looper.loop(Looper.java:158)  
     at android.app.ActivityThread.main(ActivityThread.java:7224)  
     at java.lang.reflect.Method.invoke(Native Method)  
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)  
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)  

여기 내 관련 코드는 ...

activity_main.xml :

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout 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" 
    android:background="#FFFFFF" 
    android:gravity="center" 
    tools:context="com.example.frank.listview_test.MainActivity"> 

    <fragment android:name="com.example.frank.listview_test.MainActivity$TestListFragment" 
     android:id="@+id/list" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 

</FrameLayout> 

list_fragment. xml :

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/listFragment" 
    android:layout_width="match_parent" android:layout_height="match_parent"> 

    <ListView 
     android:id="@+id/testListView" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:gravity="center" /> 

</FrameLayout> 

list_item.xml :

<?xml version="1.0" encoding="utf-8"?> 
<TextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="70dp" 
    android:textSize="50sp" 
    android:textColor="#000000" 
    android:layout_gravity="center"/> 

MainActivity.java :

package com.example.frank.listview_test; 

import android.app.Fragment; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 

public class MainActivity extends AppCompatActivity { 

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

    public static class TestListFragment extends Fragment { 

     private String[] myStringArray = new String[20]; 
     private ListView listView; 

     private void setArray() { 
      for (int i = 0; i < 10; i++) { 
       this.myStringArray[i] = "hello"; 
      } 
     } 

     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
      setArray(); 

      ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(),R.layout.list_item , myStringArray); 
      listView = (ListView) getActivity().findViewById(R.id.testListView); 
      listView.setAdapter(adapter); 

      // Inflate the layout for this fragment 
      return inflater.inflate(R.layout.list_fragment, container, false); 
     } 
    } 
} 

이 오류의 원인이 될 수있는 잘못된으로 눈에 띄는이 코드의 비트가 있습니까?

답변

2

코드 조각 onCreateView()ListView을 포함하는 list_fragment 레이아웃을 먼저 팽창해야합니다. 그런 다음 조각 레이아웃이 아직 활동보기 계층의 일부가 아니기 때문에 활동이 아닌 부풀어 오른 레이아웃에서 findViewById()을 호출해야합니다. 예를 들어

:

// Inflate the layout for this fragment 
View view = inflater.inflate(R.layout.list_fragment, container, false); 
listView = (ListView) view.findViewById(R.id.testListView); 
listView.setAdapter(adapter); 

return view; 
+0

굉장합니다. 효과가있었습니다. 그래서, 다음 질문은 당신이 괜찮다면, Fragment 클래스 내에서 활동에 대해 언제 findViewById()를 호출 할 것입니까? 프래그먼트 클래스 내에서'getActivity(). findViewById'를 사용할 곳이 있을까요? –

+1

거의 그렇지 않습니다. 디자인 측면에서 볼 때 조각은 호스팅 활동과 독립적이어야하며 계층의 다른보기와 같은 활동의 세부 정보는 신경 쓰지 않아야합니다.프래그먼트가 자체 뷰를 찾기 위해서는'onCreateView()'에서 생성 한 프래그먼트 자체의 뷰 서브 트리를 제한하는 것이 낫다. getView()를 사용하여. – laalto

0

이 시도 : 우리가 런타임에 활동에 조각을로드하려고 할 때

View view = inflater.inflate(R.layout.list_fragment, container, false); 
ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(),R.layout.list_item , myStringArray); 
      listView = (ListView) view.findViewById(R.id.testListView); 
      listView.setAdapter(adapter); 
return view; 
0

이 오류가 발생할 수 있습니다.

MainActivity.java

FragmentManager fragmentManager = getSupportFragmentManager(); 
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 

    WelcomeFragment f1 = new WelcomeFragment(); 
    fragmentTransaction.replace(R.id.fragmentContainer, f1); 
    fragmentTransaction.addToBackStack(null); 
    fragmentTransaction.commit(); 

3. LoginFragment.java 1. MainActivity.java 2. WelcomeFragment.java : 그래서, 코드 패턴은

이 세 개의 파일이 있습니다,처럼 WelcomeFragment.java

public class WelcomeFragment extends Fragment { 
Button btnLogin; 
@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.layout_fragment_welcome, container, false); 
    return view; 
} 
@Override 
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 
    btnLogin = view.findViewById(R.id.btnLogin); 
    btnLogin.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      FragmentManager fragmentManager = getFragmentManager(); 
      LoginFragment f2 = new LoginFragment(); 
      FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
      fragmentTransaction.replace(R.id.fragmentContainer, f2); 
      fragmentTransaction.addToBackStack(null); 
      fragmentTransaction.commit(); 
     } 
    }); 
} 
관련 문제