1

内部にTextViewを持つフラグメントを持つアクティビティがあります。 CourseFragment.javaでは、TextViewのテキストを変更する簡単なメソッドを作成しました。しかし、アクティビティからフラグメントのメソッドを呼び出そうとすると、TextViewオブジェクトがnullであると表示されます。フラグメント内のTextviewにアクセスできない

CourseFragment fragment = new CourseFragment(); 
FragmentManager fm = getFragmentManager(); 
FragmentTransaction ft = fm.beginTransaction(); 
ft.replace(R.id.course1, fragment); 
fragment.setTitle(); 
ft.addToBackStack(null); 
ft.commit(); 

:これは新しいフラグメントを作成し、適切な場所に置き、私の活動のコードがある

public class CourseFragment extends Fragment { 

private Subject subject; 
View rootView; 
private TextView title; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    rootView = inflater.inflate(R.layout.fragment_course, container, 
      false); 

    title = (TextView) rootView.findViewById(R.id.course_title); 

    return rootView; 
} 

public void setTitle() { 
    title.setText("My Title"); 
} 

} 

CourseFragment.java:ここに私のコードのいくつかはありますフラグメント内のsetTitle()メソッドからのエラーです。

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference 

これはまだまっすぐに見えますが、なぜNPEを得続けるのか分かりません。私はこれについて同様の質問を見て、すべての受け入れられた解決策を試したが役に立たなかった。何か案は?事前に

おかげ

編集:ここでは、要求ごとにいくつかのより多くのコードは次のとおりです。

初めfragment_course.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/course_fragment" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context="com.stagenda.stagenda.CourseFragment" 
    android:padding="16dp" 
    android:orientation="vertical" 
    android:background="@android:color/background_light"> 

    <RelativeLayout 
     android:layout_width="match_parent" 
     tools:ignore="UselessParent" 
     android:background="@color/colorAccent" 
     android:padding="16dp" 
     android:layout_height="wrap_content" 
     android:id="@+id/course_container"> 
<TextView 
     android:text="Course Given Title" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/course_given_title" 
     android:textColor="@android:color/background_light" 
     android:textSize="18sp" /> 

    <TextView 
    android:text="Course Title" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/course_title" 
    android:layout_below="@+id/course_given_title" 
    android:textColor="@android:color/background_light" /> 

    <TextView 
     android:text="Course Code" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/course_code" 
     android:textColor="@android:color/background_light" 
     android:layout_toRightOf="@+id/course_title" 
     android:layout_below="@+id/course_given_title" 
     android:layout_alignParentEnd="false" 
     android:layout_marginStart="10dp" /> 

フルエラー:

E/AndroidRuntime: FATAL EXCEPTION: main 
        Process: com.stagenda.stagenda, PID: 1654 
        java.lang.IllegalStateException: Could not execute method for android:onClick 
         at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:293) 
         at android.view.View.performClick(View.java:5639) 
         at android.view.View$PerformClick.run(View.java:22387) 
         at android.os.Handler.handleCallback(Handler.java:751) 
         at android.os.Handler.dispatchMessage(Handler.java:95) 
         at android.os.Looper.loop(Looper.java:154) 
         at android.app.ActivityThread.main(ActivityThread.java:6088) 
         at java.lang.reflect.Method.invoke(Native Method) 
         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 
         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) 
        Caused by: java.lang.reflect.InvocationTargetException 
         at java.lang.reflect.Method.invoke(Native Method) 
         at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288) 
         at android.view.View.performClick(View.java:5639)  
         at android.view.View$PerformClick.run(View.java:22387)  
         at android.os.Handler.handleCallback(Handler.java:751)  
         at android.os.Handler.dispatchMessage(Handler.java:95)  
         at android.os.Looper.loop(Looper.java:154)  
         at android.app.ActivityThread.main(ActivityThread.java:6088)  
         at java.lang.reflect.Method.invoke(Native Method)  
         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)  
         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)  
        Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference 
         at com.stagenda.stagenda.CourseFragment.setTitle(CourseFragment.java:34) 
         at com.stagenda.stagenda.MainPage.confirmAddCourse(MainPage.java:435) 
         at java.lang.reflect.Method.invoke(Native Method)  
         at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288)  
         at android.view.View.performClick(View.java:5639)  
         at android.view.View$PerformClick.run(View.java:22387)  
         at android.os.Handler.handleCallback(Handler.java:751)  
         at android.os.Handler.dispatchMessage(Handler.java:95)  
         at android.os.Looper.loop(Looper.java:154)  
         at android.app.ActivityThread.main(ActivityThread.java:6088)  
         at java.lang.reflect.Method.invoke(Native Method)  
         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)  
         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)  
I/Process: Sending signal. PID: 1654 SIG: 9 
Disconnected from the target VM, address: 'localhost:8612', transport: 'socket' 

explanation of layout (image)

+0

コミットメソッドの後にタイトルを設定してみてください。 –

+0

putExtraのテキストを渡す方が良いです。したがって、この断片は束縛されません。 – Nepster

+0

コミット後にタイトルを設定すると違いはありません。お返事ありがとうございます –

答えて

1

私はそれを自分で考え出しました。問題はここにあった:

CourseFragment fragment = new CourseFragment(); 
FragmentManager fm = getFragmentManager(); 
FragmentTransaction ft = fm.beginTransaction(); 
ft.replace(R.id.course1, fragment); 
fragment.setTitle(); 
ft.addToBackStack(null); 
ft.commit(); 

問題は、私はそのビューが作成されていなかった断片上のsetTitle()を呼び出したということでした。代わりに、私は次のような問題が解決されたなかったとき:

CourseFragment fragment = new CourseFragment(); 
FragmentManager fm = getFragmentManager(); 
FragmentTransaction ft = fm.beginTransaction(); 
ft.replace(R.id.course1, fragment); 
ft.addToBackStack(null); 
ft.commit(); 

CourseFragment frag = fm.findFragmentById(R.id.course1); 
frag.setTitle(); 

私は最終的に私のコードの多くを変更しますが、私は、これは誰かに役立ちます願っています。みんなに感謝します。

2

このapprochを付けてください。あなたが行うことができます

Bundle bundle = new Bundle(); 
    bundle.putString("title", "whatever you want to pass"); 

     CourseFragment fragment = new CourseFragment(); 
     fragment.setArguments(bundle); 
     FragmentManager fm = getFragmentManager(); 
     FragmentTransaction ft = fm.beginTransaction(); 
     ft.replace(R.id.course1, fragment); 
     ft.addToBackStack(null); 
     ft.commit(); 



    public class CourseFragment extends Fragment { 

    private Subject subject; 
    View rootView; 
    private TextView title; 
    Bundle bundle; 

     @Override 
     public void onCreate(@Nullable Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 

      bundle = getArguments(); 
     } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     rootView = inflater.inflate(R.layout.fragment_course, container, 
       false); 

     title = (TextView) rootView.findViewById(R.id.course_title); 

     String text = bundle.getString("title"); 
     title.setText(text); 

     return rootView; 
    } 


    } 
+0

の違いはありません。同じエラー –

+0

@krzこれが動作していない場合、あなたのxmlファイル 'course_title' idが存在するかどうかを確認してください。 – Spartan

+0

xmlファイルの一部を追加しました。 course_titleは –

0

ことの一つは、パラメータとしてデータを渡すことです:

CourseFragment fragment = new CourseFragment(Your title); 
FragmentManager fm = getFragmentManager(); 
FragmentTransaction ft = fm.beginTransaction(); 
ft.replace(R.id.course1, fragment); 
ft.addToBackStack(null); 
ft.commit(); 

また、あなたのデータを渡すためにバンドルを使用することができます。

+0

問題はデータを渡していません。問題はその断片にTextView –

+0

@krzを更新するように伝えることです。データを渡し、 'onCreateView'でフラグメントのタイトルを更新します。(もし、あなたがデータを断片から断片に、あるいは活動を断片から断片に動的に渡すのであれば、リスナー(インターフェース)を考えてみてください。 – Spartan

0

フラグメントトランザクションは同期していません。トランザクションを追加すると、主ルーパが実行するチャンスがあるときに実行されます(後でキューに入れられます)。

これは、現在のメソッドが終了するまでフラグメントがアタッチされることを意味します。 CourseFragment.setTitle()onCreateView()が実行された順序を確認してください。

は)(FragmentTransaction.commit用ドキュメントを参照してください:それはあなたのために働く場合commit

commitNow()を使用することを検討してください。

また、を使用してonCreateViewの内部で読み取ることができるように、タイトルをフラグメントの引数として渡すことを検討してください。タブの

+0

私はその断片がアクティビティからアクセス可能なあらゆるコントロールのためのメソッドを持っていると考えました。 –

+0

デバイスがローテーションされ、アクティビティとフラグメントが再作成されると、 'CourseFragment.setTitle()'の呼び出しが再び実行されるかどうかを検討してくださいあなたが投稿したサンプルコードからは分かりませんが、理想的なのは、必要ではないことです。フラグメントには、TextViewに表示するテキストを知るための情報が必要です。そして、私はまだ2つの関数が呼び出される順序を確認することをお勧めします;順序は結合されるべきではありません。 – frozenkoi

0

レイアウト:

<?xml version="1.0" encoding="utf-8"?> 
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:app="http://schemas.android.com/apk/res-auto" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="vertical" 
     android:background="#ffffff"> 

     <android.support.v7.widget.Toolbar 
      android:id="@+id/toolbar" 
      android:layout_width="match_parent" 
      android:layout_height="?attr/actionBarSize" 
      app:layout_scrollFlags="scroll|enterAlways" 
      app:layout_collapseMode="pin" 
      android:background="#000000" 
      app:titleTextColor="#ffffff" 

      app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" 
      app:popupTheme="@style/PopupMenuStyle"> 

      <TextView 
       android:layout_width="match_parent" 
       android:layout_height="?attr/actionBarSize" 
       android:id="@+id/textview" 
       android:textColor="@color/colorTrueWhite"/> 

     </android.support.v7.widget.Toolbar> 

     <!-- our tablayout to display tabs --> 
     <android.support.design.widget.TabLayout 
      android:id="@+id/tabLayout" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:background="@color/colorBlack" 
      android:minHeight="?attr/actionBarSize" 

      app:tabIndicatorColor="@color/colorTrueWhite" 
      app:tabIndicatorHeight="5dp" 
      android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"/> 

     <!-- View pager to swipe views --> 


     <android.support.v4.view.ViewPager 
      android:id="@+id/pager" 
      android:layout_width="match_parent" 
      android:layout_height="fill_parent"/> 


    </LinearLayout> 

がそのレイアウトを使用して、アクティビティ

public class Main2Activity extends AppCompatActivity implements TabLayout.OnTabSelectedListener { 

    private TabLayout tabLayout; 
    public static ViewPager viewPager; 
    public static Context ctx; 
    Pager adapter; 
    public static int expired, paid; 
    Boolean isConnection; 

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

     Toolbar tb = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(tb); 

     TextView tv = (TextView) findViewById(R.id.textview); 

     //getSupportActionBar().setDisplayHomeAsUpEnabled(true); 


     ctx = getApplicationContext(); 


     StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
     StrictMode.setThreadPolicy(policy); 


     tabLayout = (TabLayout) findViewById(R.id.tabLayout); 
     viewPager = (ViewPager) findViewById(R.id.pager); 


     tabLayout.addTab(tabLayout.newTab().setText("title1")); 
     tabLayout.addTab(tabLayout.newTab().setText("title2")); 
     tabLayout.addTab(tabLayout.newTab().setText("title3")); 
     tabLayout.setTabGravity(TabLayout.GRAVITY_FILL); 
     tabLayout.setupWithViewPager(viewPager); 

     adapter = new Pager(getSupportFragmentManager(), tabLayout.getTabCount(), ctx); 
     viewPager.setAdapter(adapter); 


     if(some condition) 
     { 
      viewPager.setCurrentItem(2); 
     } 
     else 
     { 
      viewPager.setCurrentItem(1); 
     } 
     viewPager.setOffscreenPageLimit(2); 

     tabLayout.addOnTabSelectedListener(this); 

     ViewGroup vg = (ViewGroup) tabLayout.getChildAt(0); 
     int tabsCount = vg.getChildCount(); 
     for (int j = 0; j < tabsCount; j++) { 
      ViewGroup vgTab = (ViewGroup) vg.getChildAt(j); 
      int tabChildsCount = vgTab.getChildCount(); 
      for (int i = 0; i < tabChildsCount; i++) { 
       View tabViewChild = vgTab.getChildAt(i); 
       if (tabViewChild instanceof TextView) { 
        ((TextView) tabViewChild).setTypeface(Typeface.DEFAULT, Typeface.BOLD); 
       } 
      } 
     } 
    } 


    @Override 
    public void onTabSelected(TabLayout.Tab tab) { 
     viewPager.setCurrentItem(tab.getPosition()); 
    } 

    @Override 
    public void onTabReselected(TabLayout.Tab tab) { 
    } 

    @Override 
    public void onTabUnselected(TabLayout.Tab tab) { 
    } 


} 

ページャコード:

public class Pager extends FragmentStatePagerAdapter 
{ 
    int tabcount; 
    Context ctx; 
    private String [] Titles = {"title1", "title2", "title3"}; 

    public Pager(FragmentManager fm, int tabcount, Context ctx) 
    { 
     super(fm); 
     this.tabcount = tabcount; 
     this.ctx = ctx; 
    } 

    @Override 
    public int getCount() { 
     return tabcount; 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     return Titles[position]; 
    } 

    @Override 
    public Fragment getItem(int position) { 

     switch (position) { 

      case 0: 
       Tab1 tab1 = new Tab1(); 
       return tab1; 

      case 1: 
       Tab2 tab2 = new Tab2(); 
       return tab2; 

      case 2: 
       Tab3 tab3 = new Tab3(); 
       return tab3; 

      default: 
       return null; 
     } 
    } 


} 
+0

このアプローチを使用して、私とうまくいった! –

0

onCreateView()メソッドは、fragmentsTransaction.commit()の後に呼び出されます。 setTitle()fragmentTransaction.commit()の前に呼び出しているため、TextViewインスタンスのタイトルはインスタンス化されていないため、nullです。 の部分を追加します。fragmentsTransaction.commit()の後にfragment.setTitle()を追加します。

関連する問題