// DetailActivity.java
public class DetailActivity extends AppCompatActivity {
MqttHandler mqttHandler;
View yun_fragment, switch_fragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_detail);
//MQTT 연결
mqttHandler = new MqttHandler(this.getApplicationContext());
mqttHandler.initConnection(pubTopic, subTopic);
...
yun_fragment = (View) findViewById(R.id.detail_fragment_rc1_area);
switch_fragment = (View) findViewById(R.id.detail_fragment_relay_area);
//전등페이지 or RC카 페이지 확인
switch (page_type) {
case 0: // 릴레이
getSupportActionBar().setTitle("전등");
yun_fragment.setVisibility(View.GONE);
switch_fragment.setVisibility(View.VISIBLE);
break;
case 1: // RC카
getSupportActionBar().setTitle("무선 RC CAR");
yun_fragment.setVisibility(View.VISIBLE);
switch_fragment.setVisibility(View.GONE);
break;
case 9999:
Toast.makeText(DetailActivity.this, "잘못된 접근입니다.", Toast.LENGTH_SHORT).show();
finish();
break;
}
...
}
...
public MqttHandler mqttHandler() {
return this.mqttHandler;
}
}
먼저 Fragment를 띄워주는 베이스 Activity입니다.
이 부분에서 객체를 넘겨주는 메소드를 하나 만들어서 객체에 내장된 메소드나 변수를 Fragment에서 사용
하려구 하는데요
// RelayFragment.java
public class RelayFragment extends Fragment {
DetailActivity detailActivity;
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_relay, container, false);
detailActivity = (DetailActivity) getActivity();
...
Switch_Status = new ArrayList<>();
Switch_Status.add(new Switch_Data("Light 1", true, true, pubTopic+"1", subTopic+"1"));
Switch_Status.add(new Switch_Data("Light 2", false, false, pubTopic+"2", subTopic+"2"));
for(int position = 0; position < Switch_Status.size(); position++) {
break-> detailActivity.mqttHandler().pTopic = Switch_Status.get(position).pubTopic;
detailActivity.mqttHandler().pTopic = Switch_Status.get(position).subTopic;
detailActivity.mqttHandler().subscribeToTopic();
new GetStatusTask().execute(position);
}
mAdapter = new Switch_Adapter(Switch_Status, RelayFragment.this);
mRecyclerView.setAdapter(mAdapter);
return v;
}
....
// mAdapter 로 생성된 스위치가 동작할때 이 메소드를 호출
public void publishTrigger(String orderStr, String topic) {
detailActivity.mqttHandler().publishMessage(orderStr, topic);
}
밑에 선언된 publishTrigger 메소드는 mAdapter로 생성된 UI스위치 리스너를 통해 호출되면
detailActivity.mqttHandler().publishMessage(orderStr, topic);
이 부분이 정상작동됩니다 (break 포인트 위치한 for문 주석 처리할경우)
하지만 컴파일을 할경우 onCreate 부분에 break 포인트에서 에러가 발생하는데 방법을 못찾고 헤메고 있습니다. 저런식의 접근이 잘못되었다는건 알겠는데 어떻게 해결해야하는지 조언부탁드립니다 ㅠㅠ


02-03 03:55:03.937 12104-12104/kr.co.open_it.smart_world E/AndroidRuntime: FATAL EXCEPTION: main
Process: kr.co.open_it.smart_world, PID: 12104
java.lang.RuntimeException: Unable to start activity ComponentInfo{kr.co.open_it.smart_world/kr.co.open_it.smart_world.DetailActivity}: android.view.InflateException: Binary XML file line #23: Binary XML file line #23: Error inflating class fragment
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2646)
...
Caused by: android.view.InflateException: Binary XML file line #23: Binary XML file line #23: Error inflating class fragment
Caused by: android.view.InflateException: Binary XML file line #23: Error inflating class fragment
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void kr.co.open_it.smart_world.handler.MqttHandler.subscribeToTopic(java.lang.String, java.lang.String)' on a null object reference
at kr.co.open_it.smart_world.fragment.RelayFragment.onCreateView(RelayFragment.java:51)
...
DetailActivity 위에 동시에 두개에 Fragment를 얹고 각프레그먼트에서 DetailActivity에 객체를 사용하려고 했는데요 값만 바뀌고 MqttAndroidClient (MqttHandler 내장 객체) 자체가 서비스로 manifest 파일에 선언을 해서 UI를 바꾸지 않기 때문에 계속 사용하려 했는데.. getset 메소드로 만들어 mTopic 변수에 접근해도 마찬가지더라구여 ㅠㅠ
참조된 객체의 값을 바꾸는건 안되는건가요?
만약 저런걸 진행하고 싶다면 어떻게 하는 방법이 좋을지 조언해주실수 있을까요?
부탁드립니다 ㅠㅠ