【问题标题】:onMenuItemSelected is not calledonMenuItemSelected 未被调用
【发布时间】:2022-11-22 16:00:51
【问题描述】:

由于onOptionsItemSelected,我想迁移到MenuProvider

实现接口并添加提供程序后,单击 Menuitem 时将不会调用 onMenuItemSelected。仅调用 onCreateMenu。

这一切都适用于旧 API,但新方法无法识别任何点击

有谁知道可能缺少什么?

代码:

import android.content.pm.ActivityInfo;
import android.os.Bundle;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.style.ForegroundColorSpan;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.AppCompatEditText;
import androidx.core.content.ContextCompat;
import androidx.core.view.MenuProvider;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentTransaction;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.Objects;

public class Editor extends Fragment implements MenuProvider {

    private AppCompatEditText properties;
    private String getFilePath;
    private Ad ad;
    private String line;


    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

        requireActivity().addMenuProvider(this);
        FileTools.deselectAllFiles();
        FileTools.setFileOperationPending(false);
        requireActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED);
        View view = inflater.inflate(R.layout.editpmyml, container, false);
        ad = new Ad(requireActivity());
        ad.init();
        requireActivity().findViewById(R.id.card).setVisibility(View.GONE);
        getFilePath = Fileexplorer.mkPath.toString();
        properties = view.findViewById(R.id.cont);
        return view;

    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable @org.jetbrains.annotations.Nullable Bundle savedInstanceState) {

        File name = new File(Fileexplorer.mkPath.toString() + "/" + ResAdapter.fileName);
        String filename = name.getName();

        if (savedInstanceState != null) {
            savedInstanceState.clear();
        }

        requireActivity().setTitle(filename);

        try(BufferedReader bufferedReader = new BufferedReader(new FileReader(getFilePath), 1024)){

            while ((this.line = bufferedReader.readLine()) != null) {

                SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(this.line + "\n");

                if (line.trim().startsWith("#")) {
                    try {
                        spannableStringBuilder.setSpan(new ForegroundColorSpan(ContextCompat.getColor(requireActivity(), R.color.GREEN)), 0, this.line.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
                        requireActivity().runOnUiThread(() -> getProperties().append(spannableStringBuilder));
                    } catch (Exception e) {
                        getProperties().append(this.line + "\n");
                    }
                } else {
                    requireActivity().runOnUiThread(() -> getProperties().append(this.line + "\n"));
                }
            }

        }  catch (Exception ignored) {}

        super.onViewCreated(view, savedInstanceState);
    }

    public static void dirSub(){
        String nameToRemove = "/"+ new File(Fileexplorer.mkPath.toString()).getName();
        Fileexplorer.mkPath.delete(Fileexplorer.mkPath.lastIndexOf("/"),Fileexplorer.mkPath.lastIndexOf("/") +nameToRemove.length());
        

    }


    @Override
    public boolean onMenuItemSelected(MenuItem item) {

        if (item.getItemId() == R.id.sv) {
            writeFile(Objects.requireNonNull(properties.getText()).toString(), getFilePath);
        }else{
            dirSub();
        }

        return true;
    }
    private void writeFile(String content,String path) {
        try(FileWriter fileWriter = new FileWriter(path)){
            ad.showAd();
            fileWriter.write(content);
            fileWriter.flush();
            Toast.makeText(getContext(), getString(R.string.saved), Toast.LENGTH_LONG).show();
            dirSub();
            requireActivity().getSupportFragmentManager().beginTransaction().setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN).setReorderingAllowed(true).replace(R.id.mainFragment,new Fileexplorer()).commit();
        } catch (Exception ignored) {
        }
    }



    @Override
    public void onCreateMenu(@NonNull Menu menu, @NonNull MenuInflater menuInflater) {
        menu.clear();
        menuInflater.inflate(R.menu.save, menu);
    }


    @Override
    public void onPause() {
        super.onPause();
        requireActivity().findViewById(R.id.card).setVisibility(View.GONE);
    }

    @Override
    public void onStop() {
        requireActivity().findViewById(R.id.card).setVisibility(View.VISIBLE);
        super.onStop();
    }

    private EditText getProperties() {
        return this.properties;
    }



}

【问题讨论】:

  • 您在片段中使用了 setHasOptionMenu(true) 中的 Override onCreate 方法;
  • setHasOptionsMenu 已弃用,我无法在该方法中覆盖 onCreate 它没有意义
  • 您的活动是否覆盖onOptionsItemSelected?请也包含该代码。

标签: java android android-lifecycle


【解决方案1】:

只需将此依赖项添加到您的应用程序级别构建.gradle文件。这将调用onOptionsItemSelected方法,这就是它为我工作的方式。

implementation 'androidx.navigation:navigation-fragment-ktx:2.5.2'

【讨论】:

    【解决方案2】:

    喜欢@ianhanniballake 的评论。也许您在活动中有类似以下代码的内容。

     override fun onMenuItemSelected(menuItem: MenuItem): Boolean {
         when (menuItem.itemId) {
             android.R.id.home -> finish()
         }
         return true // this line
     }
    

    或者

     override fun onOptionsItemSelected(item: MenuItem): Boolean {
        when (item.itemId) {
            android.R.id.home -> finish()
        }
        return true  // this line
    }   
    

    return true 表示您处理了每个菜单项而不执行其他菜单处理。

    在活动中用 false 替换 true 对我有用。

    【讨论】:

      猜你喜欢
      • 2013-07-19
      • 1970-01-01
      • 1970-01-01
      • 2019-02-07
      • 2016-05-21
      • 2012-02-15
      • 2011-11-17
      • 2019-10-22
      • 2016-04-03
      相关资源
      最近更新 更多