#android
#Android
Вопрос:
Итак, я нахожусь в некоторой дилемме, у меня есть кнопка в моем DashboardFragment, на которую можно ссылаться только внутри этого класса, и мне нужна эта кнопка для включения Bluetooth, что выполняется в отдельном действии. Я бы предпочел не иметь код Bluetooth в моем классе fragment, поскольку на bluetooth будут ссылаться несколько фрагментов. Проблема в том, что когда я пытаюсь ссылаться на кнопку действия из класса Fragment, я получаю нулевую ссылку на объект. Вот мой класс DashboardFragment:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
public View onCreateView(@NonNull LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
View root = inflater.inflate(R.layout.fragment_dashboard, container, false);
return root;
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
connButton = (Button) getView().findViewById(R.id.button2);
connectionActivity = new ConnectionActivity();
connectionActivity.initView(connButton);
}
И моя активность:
public class ConnectionActivity extends AppCompatActivity {
private static final String TAG = ConnectionActivity.class.getSimpleName();
BluetoothAdapter mBluetoothAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
public final BroadcastReceiver mBroadcastReceiver1 = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
if (action.equals(mBluetoothAdapter.ACTION_STATE_CHANGED)) {
final int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE,
mBluetoothAdapter.ERROR);
//Use for when implementing states
switch (state) {
case BluetoothAdapter.STATE_OFF:
/*MainActivity.MyArrayAdapter adapter = (MainActivity.MyArrayAdapter) deviceSpinner.getAdapter();
if (adapter != null) {
adapter.clear();
adapter.notifyDataSetChanged();
}*/
Log.d(TAG, "STATE OFF");
break;
case BluetoothAdapter.STATE_TURNING_OFF:
Log.d(TAG,"STATE TURNING OFF");
break;
case BluetoothAdapter.STATE_ON:
//populateDeviceSpinner();
Log.d(TAG,"I'm ON!");
break;
case BluetoothAdapter.STATE_TURNING_ON:
Log.d(TAG,"Turning On...");
}
}
}
};
public void initView(Button connButton) {
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
connButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
enableDisableBT();
}
});
}
public void enableDisableBT() {
if (mBluetoothAdapter == null) {
Log.d(TAG, "Device does not have BLuetooth capabilites");
}
if (!mBluetoothAdapter.isEnabled()) {
Intent enableBTIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivity(enableBTIntent);
IntentFilter filter = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED);
registerReceiver(mBroadcastReceiver1, filter);
}
if (mBluetoothAdapter.isEnabled()) {
mBluetoothAdapter.disable();
IntentFilter filter = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED);
registerReceiver(mBroadcastReceiver1, filter);
}
}
}
Комментарии:
1. Вы не должны ссылаться на
views
связанный сactivity
(родительской областью) изfragment
(дочерней области), потому что вы можете утечка памяти. Если вашfragment
содержит ссылку наactivity
в форме thisview
, тоfragment
из-за этой ссылки он никогда не освободит память для сборки мусора.2. Да, это имеет смысл. Что бы вы предложили вместо этого? Я попытался получить доступ к этой кнопке из ConnectionActivity, но это не позволит, поскольку кнопка связана с фрагментом панели мониторинга. Извините, я действительно новичок в программировании на Android, и я продолжаю получать отрицательные голоса всякий раз, когда задаю подобные вопросы.
Ответ №1:
Просто добавьте ссылку в onViewCreated из DashboardFragment в
((ConnectionActivity) getActivity()).initView(connButton)