onMenuItemSelected 未调用

问题描述 投票:0回答:2

自从

onOptionsItemSelected
我想迁移到
MenuProvider

实现接口并添加provider后,点击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;
    }



}
java android android-lifecycle
2个回答
5
投票

喜欢@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
表示您处理了每个菜单项,而不执行其他菜单处理。

在活动中将

true
替换为
false
对我有用。


0
投票

只需将此依赖项添加到您的应用程序级别 build.gradle 文件即可。这将调用 onOptionsItemSelected 方法,这就是它对我的作用。

implementation 'androidx.navigation:navigation-fragment-ktx:2.5.2'
© www.soinside.com 2019 - 2024. All rights reserved.