Как получить доступ к кнопке из действия во фрагменте?

#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 в форме this view , то fragment из-за этой ссылки он никогда не освободит память для сборки мусора.

2. Да, это имеет смысл. Что бы вы предложили вместо этого? Я попытался получить доступ к этой кнопке из ConnectionActivity, но это не позволит, поскольку кнопка связана с фрагментом панели мониторинга. Извините, я действительно новичок в программировании на Android, и я продолжаю получать отрицательные голоса всякий раз, когда задаю подобные вопросы.

Ответ №1:

Просто добавьте ссылку в onViewCreated из DashboardFragment в

((ConnectionActivity) getActivity()).initView(connButton)