onMenuItemSelected方法没有被调用。

5

由于想要迁移到MenuProvider,我希望你能翻译onOptionsItemSelected

实现接口并添加提供程序后,单击菜单项时将不会调用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;
    }



}

你在Fragment中使用了setHasOptionsMenu(true)方法,因此需要重写onCreate方法。 - Gobu CSG
setHasOptionsMenu方法已经过时,我无法在其中重写onCreate方法,这没有意义。 - kpwn Apps
1
你的活动是否覆盖了 onOptionsItemSelected 方法?请同时包含该代码。 - ianhanniballake
2个回答

4

像 @ianhanniballake 的评论所述,也许您在 Activity 中有以下类似的代码。

 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 表示你已经处理完所有菜单项,不需要执行其他菜单操作。

在 Activity 中用 false 替代 true 对我很有效。


0

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

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

我已经添加了相同的内容,但是仍然存在相同的问题。 - Irurik Soft Labs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接