2017-07-14 41 views
1

私はカスタムBottomSheetDialogFragmentを持っていて、そのTextViewを私のMainActivityに設定したいと思います。私はそのビューへの参照を取得しようとしましたが、nullポインタの例外があります。私はこのように私のMainActivityからFragmentを作成します。ここでは BottomSheetDialogFragment内のTextViewにテキストを設定する方法

public void buttonClick(View view) { 
    CustomBottomSheetDialogFragment bottomSheetDialogFragment = new CustomBottomSheetDialogFragment(); 
    View sheetView = bottomSheetDialogFragment.getView(); 
    TextView sheetText = (TextView) sheetView.findViewById(R.id.cmp1); 
    sheetText.setText("blah"); 
    bottomSheetDialogFragment.show(getSupportFragmentManager(), "Dialog"); 
} 

は私のBottomSheetDialogFragmentクラスです:

public class CustomBottomSheetDialogFragment extends BottomSheetDialogFragment { 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View v = inflater.inflate(R.layout.content_bottom_sheet, container, false); 
     return v; 
    } 
} 

そして、ここではXMLです:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/bottomSheetLayout" 
    android:layout_width="match_parent" 
    android:layout_height="300dp" 
    android:background="@android:color/white" 
    android:padding="16dp" 
    app:behavior_hideable="true" 
    app:behavior_peekHeight="60dp" 
    app:layout_behavior="@string/bottom_sheet_behavior"> 

    <TextView 
     android:id="@+id/bottomSheetHeading" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text="Test" 
     android:textAppearance="@android:style/TextAppearance.Large" /> 

    <TextView 
     android:id="@+id/cmp1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_below="@id/bottomSheetHeading" 
     android:layout_centerHorizontal="true" 
     android:layout_marginTop="16dp" 
     android:text="Test Message" 
     android:textAppearance="@android:style/TextAppearance.Medium" /> 

</RelativeLayout> 

私が正しくへの参照を取得するにはどうすればよいですテキストビュー?ありがとう!

編集:ここではエラーがあります:

java.lang.IllegalStateException: Could not execute method for android:onClick 
                       at android.view.View$DeclaredOnClickListener.onClick(View.java:4725) 
                       at android.view.View.performClick(View.java:5637) 
                       at android.view.View$PerformClick.run(View.java:22429) 
                       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:6119) 
                       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.view.View$DeclaredOnClickListener.onClick(View.java:4720) 
                       at android.view.View.performClick(View.java:5637)  
                       at android.view.View$PerformClick.run(View.java:22429)  
                       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:6119)  
                       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 'android.view.View android.view.View.findViewById(int)' on a null object reference 
                       at com.gofrontrow.conductor_mobile.MainActivity.buttonClick(MainActivity.java:108) 
                       at java.lang.reflect.Method.invoke(Native Method)  
                       at android.view.View$DeclaredOnClickListener.onClick(View.java:4720)  
                       at android.view.View.performClick(View.java:5637)  
                       at android.view.View$PerformClick.run(View.java:22429)  
                       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:6119)  
                       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)  

最終編集:最後に、私はちょうどフラグメントのコンストラクタを作って、文字列をそのように合格しました。私はthisポストをガイドとして使用しました。

+0

'nullPointerException'エラーログを貼り付けてください。 –

答えて

0

私は別のアプローチを提案しています。単にBottomSheetDialogFragmentの中にメソッドを作成してbuttonClickとか本当に何かを作成してください。

View v = inflater.inflate(R.layout.content_bottom_sheet, container, false); 
// declare it as a field at the top of the class 
sheetText = (TextView) sheetView.findViewById(R.id.cmp1); 
return v; 

そして今、あなたのsheetTextのTextViewへの参照を持っていることを、あなたがそうのような通常の方法で作成することができます:

void onButtonClick(String text){ 
    sheetText.setText(text); 
} 

そして、あなたをとonCreateViewの内側には、それにTextViewはそうのようなidだバインドそのようMainActivityから、このいずれかを呼び出すことができます。

public void buttonClick(View view) { 
    CustomBottomSheetDialogFragment bottomSheetDialogFragment = new CustomBottomSheetDialogFragment(); 
    bottomSheetDialogFragment.show(getSupportFragmentManager(), "Dialog"); 
    bottomSheetDialogFragment.onButtonClick("whatever); 
} 

また、あなたがcontinuしたくない場合あなたがやろうとしていることを誤解した場合、MainActivityのボタンをクリックしてテキストを変更すると、コンストラクタにパラメータを渡すこともできます。

+0

ありがとう、私はちょうどこれを試みたと私はまだ "仮想メソッドを呼び出すしようとしました 'nullオブジェクト参照でvoid android.widget.TextView.setText(java.lang.CharSequence)' – Jason

+0

私はちょうど"ショー "、ボトムシート、それは動作します。それは何らかの理由でクラッシュしているtextviewにアクセスしています。 – Jason

+0

OK onButtonClickとonCreateViewにprintステートメントを追加しました。これは、onCreateViewが呼び出される前に "onButtonClick"メソッドが呼び出されていることです。私はなぜ、たとえonButtonClickがmainactivityの下で.showであるとしても、なぜか分かりません。ここで何が起こっているのですか? – Jason

関連する問題