2016-11-19 1 views
1

그래서 appcompat 활동을 사용하여 툴바 (동작 표시 줄)가 포함 된 프래그먼트를 만들려고 여러보기에서 재사용 할 수 있습니다.안드로이드 - 단편이 아닌 클래스를 인스턴스화하려고합니다.

단편을 확장하고 작동하도록하는 클래스를 사용하여 간단한 텍스트 전용 조각을 테스트했지만보기에 AppCompatActivity을 확장해야합니다 (필자는 생각합니다).

이 기능을 작동 시키려고하면 action_bar_fragmentFragment이 아니라는 오류가 발생합니다.

나는 여기에 기본적인 것을 놓치고있는 것처럼 느껴졌다. 어떤 아이디어?

주요 활동 :

package com.example.aaron.personaldataassistant; 

import android.support.v7.app.ActionBar; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.content.Intent; 
import android.support.v7.widget.Toolbar; 
import android.view.MenuInflater; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.Button; 
import android.view.Menu; 
import android.widget.Toast; 

public class MainActivity extends AppCompatActivity { 

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

     // action_bar_fragment = (Toolbar) findViewById(R.id.action_bar_fragment); 
     // setSupportActionBar(action_bar_fragment); 
    } 


    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 

     MenuInflater mi=getMenuInflater(); 
     mi.inflate(R.menu.action_bar, menu); 
     return super.onCreateOptionsMenu(menu); 
    } 

주요 활동 레이아웃 :

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:orientation="vertical" 
    android:id="@+id/activity_main" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    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="com.example.aaron.personaldataassistant.MainActivity"> 


    <fragment 
     android:id="@+id/action_bar_fragment" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     class="com.example.aaron.personaldataassistant.action_bar_fragment" 
     tools:layout="@layout/action_bar_fragment" /> 

</LinearLayout> 

작업 표시 줄 조각 :

package com.example.aaron.personaldataassistant; 

import android.os.Bundle; 
import android.support.annotation.Nullable; 
import android.support.v4.app.Fragment; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.Toolbar; 
import android.view.LayoutInflater; 
import android.view.Menu; 
import android.view.MenuInflater; 
import android.view.MenuItem; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.Toast; 

public class action_bar_fragment extends AppCompatActivity { 

    public action_bar_fragment() { 
    } 

    Toolbar action_bar; 

    @Nullable 

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

     return inflater.inflate(R.layout.action_bar_fragment, container, false); 

    } 


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


      action_bar = (Toolbar) findViewById(R.id.action_bar); 
      setSupportActionBar(action_bar); 
     } 



    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 

     MenuInflater mi = getMenuInflater(); 
     mi.inflate(R.menu.action_bar, menu); 
     return super.onCreateOptionsMenu(menu); 
    } 


    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 

     int i = item.getItemId(); 

     if (i == R.id.item1) { 

      Toast.makeText(action_bar_fragment.this, "Item 1", Toast.LENGTH_SHORT).show(); 
     } else if (i == R.id.item2) { 

      Toast.makeText(action_bar_fragment.this, "Item 2", Toast.LENGTH_SHORT).show(); 
     } else if (i == R.id.item3) { 

      Toast.makeText(action_bar_fragment.this, "Item 3", Toast.LENGTH_SHORT).show(); 
     } 
//replace toasts with desired actions: Settings, Help and Exit. Settigns is blank, help is context-dependent, exit gives possibility to exit 


     return super.onOptionsItemSelected(item); 
    } 


} 

조각 레이아웃 :

<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" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    tools:context="layout.Fragment_1"> 

    <!-- TODO: Update blank fragment layout --> 
    <TextView 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:text="@string/hello_blank_fragment" /> 

    <android.support.v7.widget.Toolbar 
     android:id="@+id/action_bar" 
     android:layout_width="300dp" 
     android:layout_height="?attr/actionBarSize" 
     android:background="?attr/colorPrimaryDark" 
     android:elevation="8dp" 
     android:theme="@style/ThemeOverlay.AppCompat.ActionBar" 
     app:popupTheme="@style/ThemeOverlay.AppCompat.Light" 
     android:layout_alignParentTop="true" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" 
     /> 

</FrameLayout> 

그리고 물론 오류 메시지 :

--------- beginning of crash 
E/AndroidRuntime: FATAL EXCEPTION: main 
        Process: com.example.aaron.personaldataassistant, PID: 2481 
        java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.aaron.personaldataassistant/com.example.aaron.personaldataassistant.MainActivity}: android.view.InflateException: Binary XML file line #19: Binary XML file line #19: Error inflating class fragment 
         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2646) 
         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707) 
         at android.app.ActivityThread.-wrap12(ActivityThread.java) 
         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460) 
         at android.os.Handler.dispatchMessage(Handler.java:102) 
         at android.os.Looper.loop(Looper.java:154) 
         at android.app.ActivityThread.main(ActivityThread.java:6077) 
         at java.lang.reflect.Method.invoke(Native Method) 
         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) 
         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755) 
        Caused by: android.view.InflateException: Binary XML file line #19: Binary XML file line #19: Error inflating class fragment 
        Caused by: android.view.InflateException: Binary XML file line #19: Error inflating class fragment 
        Caused by: android.app.Fragment$InstantiationException: Trying to instantiate a class com.example.aaron.personaldataassistant.action_bar_fragment that is not a Fragment 
         at android.app.Fragment.instantiate(Fragment.java:617) 
         at android.app.Fragment.instantiate(Fragment.java:593) 
         at android.app.FragmentManagerImpl.onCreateView(FragmentManager.java:2302) 
         at android.app.FragmentController.onCreateView(FragmentController.java:98) 
         at android.app.Activity.onCreateView(Activity.java:5884) 
         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:777) 
         at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:727) 
         at android.view.LayoutInflater.rInflate(LayoutInflater.java:858) 
         at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:821) 
         at android.view.LayoutInflater.inflate(LayoutInflater.java:518) 
         at android.view.LayoutInflater.inflate(LayoutInflater.java:426) 
         at android.view.LayoutInflater.inflate(LayoutInflater.java:377) 
         at android.support.v7.app.AppCompatDelegateImplV9.setContentView(AppCompatDelegateImplV9.java:284) 
         at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:140) 
         at com.example.aaron.personaldataassistant.MainActivity.onCreate(MainActivity.java:24) 
         at android.app.Activity.performCreate(Activity.java:6662) 
         at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118) 
         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2599) 
         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707) 
         at android.app.ActivityThread.-wrap12(ActivityThread.java) 
         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460) 
         at android.os.Handler.dispatchMessage(Handler.java:102) 
         at android.os.Looper.loop(Looper.java:154) 
         at android.app.ActivityThread.main(ActivityThread.java:6077) 
         at java.lang.reflect.Method.invoke(Native Method) 
         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) 
         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755) 
        Caused by: java.lang.ClassCastException 
         at android.app.Fragment.instantiate(Fragment.java:618) 
         at android.app.Fragment.instantiate(Fragment.java:593)  
         at android.app.FragmentManagerImpl.onCreateView(FragmentManager.java:2302)  
         at android.app.FragmentController.onCreateView(FragmentController.java:98)  
         at android.app.Activity.onCreateView(Activity.java:5884)  
         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:777)  
         at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:727)  
         at android.view.LayoutInflater.rInflate(LayoutInflater.java:858)  
         at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:821)  
         at android.view.LayoutInflater.inflate(LayoutInflater.java:518)  
         at android.view.LayoutInflater.inflate(LayoutInflater.java:426)  
         at android.view.LayoutInflater.inflate(LayoutInflater.java:377)  
         at android.support.v7.app.AppCompatDelegateImplV9.setContentView(AppCompatDelegateImplV9.java:284)  
         at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:140)  
         at com.example.aaron.personaldataassistant.MainActivity.onCreate(MainActivity.java:24)  
         at android.app.Activity.performCreate(Activity.java:6662)  
         at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)  
         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2599)  
         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)  
         at android.app.ActivityThread.-wrap12(ActivityThread.java)  
         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)  
         at android.os.Handler.dispatchMessage(Handler.java:102)  
         at android.os.Looper.loop(Looper.java:154)  
         at android.app.ActivityThread.main(ActivityThread.java:6077)  
         at java.lang.reflect.Method.invoke(Native Method)  
         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)  
         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)  
Application terminated. 

이 시간 내 주셔서 감사합니다.


UPDATE

이 중대하다, 상단 대답은 나 조각에서 일을하는 것은 활동을하는 것보다 다른 방법을 필요로 할 수 있음을 알아낼 수있었습니다. 인터넷 검색 "조각에서 X를하는 방법"은 내가 필요한 거의 모든 것을 제공하기 위해 나왔다. 이 단지 하나의 문제는 지금 왼쪽입니다 : 내가

setHasOptionsMenu(true); 
action_bar = (Toolbar) getView().findViewById(R.id.action_bar); 

이 나에게 null 객체 참조를주고에 라인 (37) 작업 표시 줄 조각을 변경하지만, 레이아웃은 확실히 존재! 무슨 일있어?

오류 메시지의 관련 부분은 다음과 같습니다 당신에게 다시 점점 긴 지연 죄송합니다

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.View.findViewById(int)' on a null object reference 

, 내가 일을했다. 이 시간이 더 빨라야합니다!

답장에 대한 답장을 정리합니다.

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    MenuInflater mi=getMenuInflater(); 
    mi.inflate(R.menu.action_bar, menu); 
    return super.onCreateOptionsMenu(menu); 
} 

변경이로 : 당신의 MainActivity 클래스에서

답변

2

이것은 당신의 구성 조각은 조각 있지만 활동하지 않기 때문에이다 :

action_bar_fragment extends Fragment { 

} 

그리고 : 당신이해야한다, 그래서

action_bar_fragment extends AppCompatActivity { 

} 

이 활동입니다 조각으로 action_bar_fragment를 확장 코드 스타일을 변경하십시오. action_bar_fragmentActionBarFragment과 같아야합니다. 클래스 이름은 대문자로 시작해야합니다.

Creating and Using Fragments을 읽으십시오.

+0

Fragment에서 작업을 수행하는 방법은 Activity에서 수행하는 것과 완전히 다를 수 있으므로 "필요한 X에서 어떻게해야합니까?"라는 질문을 통해 필요한 정보를 얻었습니다. 지금은 이상한 NullPointerException이 있는데 왜 그런지 모르겠습니다. 자세한 내용은 주요 질문의 맨 아래에 있습니다. 어떤 아이디어? – Telamnar

+0

조각의'onCreateView()'에 레이아웃을 부 풀리지 않았기 때문일 수 있습니다. like : '@Override public View onCreateView (LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) { return inflater.inflate (R.layout.fragment_some, parent, false); }' –

+0

또는 레이아웃에'action_bar'이 없습니다 –

0

, 당신은 코드의 일부의 순서를 변경해야합니다, 그들은이다

@Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
    super.onCreateOptionsMenu(menu); 
    MenuInflater mi = getMenuInflater(); 
    mi.inflate(R.menu.action_bar, menu); 
    return true; 

}

하고 다시 시도하십시오.

+2

흠! 너 정말 형제 니? – mallaudin

3

"제목이 아닌 클래스를 인스턴스화하려고합니다."라는 주요 제목 때문에이 질문이 나타납니다. 어쩌면 내 해결책이 도움이 될 수 있습니다.

... 
Caused by: android.app.Fragment$InstantiationException: Trying to instantiate a class com.xyz.tuv.MyFragment that is not a Fragment 

것은 내가 오기 때문에 :

import android.support.v4.app.Fragment; 

대신

import android.app.Fragment; 
나는 그 오류가 발생했습니다 API (15)

안드로이드 스튜디오 2.2.3을 사용하여 타겟팅하는

API 11부터 정기적 인 활동 (android.app.Activity)을 사용하여 문서화 된대로조각을 삽입 할 수 있습니다. 그러나이 경우 main example의 내용과 반대로 android.app.Fragment을 사용해야합니다.

+0

Android Studio 템플릿에서 목록 조각을 만든 후 나에게도 일어났습니다. 가져 오기 이름을 변경했습니다. –

관련 문제