I am trying to build a sample app which has two fragments in same activity. One fragment has EditText, SeekBar & a Button. Second Fragment has a TextView. On entering text in the EditText of first fragment and setting seekbar to appropriate value and clicking the button will change the text in the second fragment with the text entered in first fragment and size described by seekbar. I wrote a good code but the app keeps crashing on clicking the button. Please help!
Fragment one:
import ....
public class Toolbarfragment extends Fragment implements OnSeekBarChangeListener {
private static int seekvalue = 10;
private static EditText edittext;
public interface ToolbarListener {
void onButtonClick(int pos, String tex);
}
ToolbarListener activityCallback;
@Override
public View onCreateView( LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.toolbarfragment, container, false);
edittext= (EditText)view.findViewById(R.id.editTextTextPersonName);
final Button button = (Button) view.findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
buttonclicked(v);
}
});
final SeekBar seekBar = (SeekBar) view.findViewById(R.id.seekBar);
seekBar.setOnSeekBarChangeListener(this);
return view;
}
public void buttonclicked(View view) {
activityCallback.onButtonClick(seekvalue, edittext.getText().toString());
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
seekvalue = progress;
}
@Override
public void onStartTrackingTouch(SeekBar arg0) {
}
@Override
public void onStopTrackingTouch(SeekBar arg0) {
}
}
Fragment two:
import ...
public class TextFragment extends Fragment {
private static TextView textview;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view= inflater.inflate(R.layout.textfragment,container,false);
textview = view.findViewById(R.id.textView);
return view;
}
public void changetextproperties(int size, String text) {
textview.setText(text);
textview.setTextSize(size);
}
}
Main Activity:
import ...
public class MainActivity extends FragmentActivity implements Toolbarfragment.ToolbarListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public void onButtonClick(int size, String text) {
TextFragment textfragment= (TextFragment)getSupportFragmentManager().findFragmentById(R.id.fragment2);
textfragment.changetextproperties(size, text);
}
}
Logcat :
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.badatext, PID: 13829
java.lang.NullPointerException: Attempt to invoke interface method 'void com.example.badatext.Toolbarfragment$ToolbarListener.onButtonClick(int, java.lang.String)' on a null object reference
at com.example.badatext.Toolbarfragment.buttonclicked(Toolbarfragment.java:52)
at com.example.badatext.Toolbarfragment$1.onClick(Toolbarfragment.java:37)
at android.view.View.performClick(View.java:6597)
at android.view.View.performClickInternal(View.java:6574)
at android.view.View.access$3100(View.java:778)
at android.view.View$PerformClick.run(View.java:25885)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
Figured it out!
By overriding OnAttach() method in Toolbarfragment class
@Override
public void onAttach(Context context) {
super.onAttach(context);
activityCallback = (ToolbarListener) context;}