【问题标题】:How do I Listen events from the toolbar in fragments?如何在片段中监听来自工具栏的事件?
【发布时间】:2016-12-20 17:26:12
【问题描述】:

我正在制作一个包含一个包含选项卡布局和 Viewpager 的活动的应用程序,我有 3 个选项卡,每个选项卡都有一个片段。主要活动有一个工具栏,上面有一个开关。

关键是我需要监听主活动和片段中的这个开关的事件变化。实际上我在 MainActivity 中调用了 onCreateOptionsMenu 和 onOptionItemSelected 并且可以工作,但是可以再次在片段中使用此方法吗? o 如何从片段的工具栏中侦听 UI 控件的事件?

小米码是:

MainActivity.java

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Toolbar myToolbar = (Toolbar) findViewById(R.id.my_toolbar);
    setSupportActionBar(myToolbar);

    viewPager = (ViewPager) findViewById(R.id.viewpager);
    setupViewPager(viewPager);

    tabLayout = (TabLayout) findViewById(R.id.tabs);
    tabLayout.setupWithViewPager(viewPager);



    if(ContextCompat.checkSelfPermission(MainActivity.this,Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED){
        wifiManager = (WifiManager) this.getSystemService(Context.WIFI_SERVICE);
    }else{
        if(ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this,Manifest.permission.ACCESS_FINE_LOCATION)){
            Toast.makeText(MainActivity.this,"Debes autorizar los permisos de ubicacion",Toast.LENGTH_SHORT).show();
        }else{
            ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.ACCESS_FINE_LOCATION},LOCATION_REQUEST_CODE);
        }
    }


}

private void setupViewPager(ViewPager viewPager){
    ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
    adapter.addFragment(new OneFragment(), getString(R.string.tabRedes));
    adapter.addFragment(new TwoFragment(),getString(R.string.tabRedesGuardadas));
    adapter.addFragment(new ThreeFragment(),getString(R.string.tabMapas));
    viewPager.setAdapter(adapter);

}

@Override
public boolean onCreateOptionsMenu(Menu menu){
    getMenuInflater().inflate(R.menu.menuactionbar,menu);
    final SwitchCompat switch1= (SwitchCompat) menu.findItem(R.id.switch_wifi).getActionView().findViewById(R.id.switchForActionBar);


    if(ContextCompat.checkSelfPermission(MainActivity.this,Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED){

        switch1.setChecked(wifiManager.isWifiEnabled());

        if(wifiManager.isWifiEnabled()){
            switch1.setText(R.string.switchOnWifiEs);
        }else {
            switch1.setText(R.string.swtichOffWifiEs);
            //wifiManager.setWifiEnabled(true);
        }

        switch1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if (isChecked){
                    switch1.setText(R.string.switchOnWifiEs);
                    wifiManager.setWifiEnabled(true);
                    Toast.makeText(MainActivity.this,R.string.switchingOnWifiEs,Toast.LENGTH_SHORT).show();
                }
                else{
                    switch1.setText(R.string.swtichOffWifiEs);
                    wifiManager.setWifiEnabled(false);
                    Toast.makeText(MainActivity.this,R.string.switchingOffWifiEs,Toast.LENGTH_SHORT).show();
                }
            }
        });

    }else{
        if(ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this,Manifest.permission.ACCESS_FINE_LOCATION)){
            Toast.makeText(MainActivity.this,"Debes autorizar los permisos de ubicacion",Toast.LENGTH_SHORT).show();
        }else{
            ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.ACCESS_FINE_LOCATION},LOCATION_REQUEST_CODE);
        }
    }


    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item){

    switch (item.getItemId()){
        case R.id.menu_settings:
            Intent nav = new Intent(MainActivity.this,configuracion_Activity.class);
            startActivity(nav);
            return true;
        case R.id.menu_acercade:
            Intent nav2 = new Intent(MainActivity.this,acercade_Activity.class);
            startActivity(nav2);
            return true;
        default:
            Toast.makeText(MainActivity.this,"Estas entrando en e Default",Toast.LENGTH_SHORT).show();
            return super.onOptionsItemSelected(item);
    }
}

【问题讨论】:

标签: java android android-fragments fragment android-toolbar


【解决方案1】:

在你的 Switch 的 CheckedChangeListener 中

  switch1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                    if (isChecked){
                        switch1.setText(R.string.switchOnWifiEs);
                        wifiManager.setWifiEnabled(true);
                        Toast.makeText(MainActivity.this,R.string.switchingOnWifiEs,Toast.LENGTH_SHORT).show();                 
                    }
                    else{
                        switch1.setText(R.string.swtichOffWifiEs);
                        wifiManager.setWifiEnabled(false);
                        Toast.makeText(MainActivity.this,R.string.switchingOffWifiEs,Toast.LENGTH_SHORT).show();
                    }
final Fragment currentFragment = getFragmentManager().findfragmentId(R.id.container);
if(currentFragment instance HomeFragment){
((HomeFragment)currentFragment).switchClicked(isChecked);
}


                }
            });

在您的片段中:

public void switchClicked(final boolean isChecked){
...... your code.
}

【讨论】:

    【解决方案2】:

    我自己找到了答案,IDK if 是最好的方法,但对我来说很好:

    在我的片段中:

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater){
        super.onCreateOptionsMenu(menu, inflater);
        final SwitchCompat switch1= (SwitchCompat) menu.findItem(R.id.switch_wifi).getActionView().findViewById(R.id.switchForActionBar);
    
        switch1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if(isChecked){
                    fab.setVisibility(View.VISIBLE);
                }
                else{
                    fab.setVisibility(View.GONE);
                }
            }
        });
    

    【讨论】:

      【解决方案3】:

      你应该看看这个 How to get Toolbar from fragment?

      很久以前这对我有帮助。 d:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多