onMenuItemSelected未被调用



由于onOptionsItemSelected我想迁移到MenuProvider

在实现接口并添加提供程序后,onMenuItemSelected在点击Menuitem时不会被调用。只有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;
}

}

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

在活动中用false代替true对我来说是有效的。

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

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

最新更新