마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

setAdapter 문제 질문입니다

0 추천
public class ManagerUserman extends Fragment {
    private View view;
    private ListView listView;
    private ManagerUsermanListAdapter adapter;
    private List<ManagerUsermanList> managerUsermanList;

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        view = inflater.inflate(R.layout.activity_manageruserman_list, container, false);
        TextView userName = (TextView) view.findViewById(R.id.userName);
        Intent intent = getActivity().getIntent();

        listView = (ListView) view.findViewById(R.id.listView);
        managerUsermanList = new ArrayList<ManagerUsermanList>();
        adapter = new ManagerUsermanListAdapter(getActivity().getApplicationContext(), managerUsermanList);
        listView.setAdapter(adapter);

        managerUsermanList.add(new ManagerUsermanList("홍길동", "admin", "1234", "30"));
        managerUsermanList.add(new ManagerUsermanList("홍길동", "admin", "1234", "30"));
        managerUsermanList.add(new ManagerUsermanList("홍길동", "admin", "1234", "30"));
        managerUsermanList.add(new ManagerUsermanList("홍길동", "admin", "1234", "30"));


        return view;
    }
}

자꾸만 프레그먼트 클릭하면 꺼져서 디버깅 찍어서 확인해보니 setAdapter문제로 확인됐습니다 이 구문을 어떻게 고쳐야 하나요?

살려주세요제발제발요 (670 포인트) 님이 2022년 9월 1일 질문

2개의 답변

0 추천
Logcat에서 에러메세지를 찾아서 올려보세요.
spark (227,530 포인트) 님이 2022년 9월 2일 답변
디버그 오류는 따로 뜨는 게 없고 꺼지는 것만 확인이 되는데 이런 경우에는 그 오류가 아니느건가요?
앱이 꺼진다는게 크래시가 난다는 걸로 이해했는데, 아닌가요? 크래시가 나면 분명히 에러 로그가 있을텐데요. 크래시가 아니라면 앱을 닫는 관련 코드가 있을 거구요.
제가 디버그 찍는 게 미숙해서 그런 걸수도 있겠네요 에러 뜨면 긁어서 여쭈어봐도 될까요?
E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.myapplication_study, PID: 21848
    java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ListView.setAdapter(android.widget.ListAdapter)' on a null object reference
        at com.example.myapplication_study.ManagerUserman.onCreateView(ManagerUserman.java:44)
        at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2995)
        at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:523)
        at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:261)
        at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:1840)
        at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1758)
        at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1701)
        at androidx.fragment.app.FragmentManager$4.run(FragmentManager.java:488)
        at android.os.Handler.handleCallback(Handler.java:938)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:223)
        at android.app.ActivityThread.main(ActivityThread.java:7656)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)

이런 오류가 뜨네요 값이 null이라 그런 건가요?
0 추천
listView = (ListView) view.findViewById(R.id.listView)


위의 라인이 문제로 보이네요. 해당 id의 뷰는ListView가 아니거나 존재하지 않아 보여요. 그래서 listView 변수가 null이라서 발생하는 에러입니다.
 참고로 findViewById 대신에 ViewBinding을 사용하시면 뷰를 찾아 변수애 담을 필요가 없기 때문에 더 안전합니다.

spark (227,530 포인트) 님이 2022년 9월 3일 답변
spark님이 2022년 9월 3일 수정
...