java - 使用 fragment 上的按钮打开 AlertDialog

标签 java android android-alertdialog

我尝试在 MainActivity 中的 3 个 fragment 中的 1 个 fragment 上打开带有图像按钮的 AlertDialog,但我总是遇到 2 个问题中的 1 个。

  1. 无法从非静态上下文引用方法 openDialog()
  2. .非静态方法“getSupportFragmentManager()”无法从静态上下文中引用

我尝试了几种不同的方法,但它们都遇到了这样的问题。

我的目标是让 timetableFragment.java 上的 ImageButton 打开一个对话框。目前我已经为 AlertDialog 创建了一个额外的类。

我是初学者,请尽量保持简单。

我的主要 Activity :

公共(public)类 MainActivity 扩展 AppCompatActivity {

private FrameLayout bar_todo;
private FrameLayout bar_timetable;
private FrameLayout bar_notes;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    todoFragment todoFragment = new todoFragment();
    getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, todoFragment).commit();


    bar_todo = findViewById(R.id.image_todo);
    bar_timetable = findViewById(R.id.image_timetable);
    bar_notes = findViewById(R.id.image_notes);


    bar_todo.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            todoFragment todoFragment = new todoFragment();
            getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, todoFragment).commit();
        }
    });


    bar_timetable.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            timetableFragment timetableFragment = new timetableFragment();
            getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, timetableFragment).commit();
        }
    });

    bar_notes.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            notesFragment notesFragment = new notesFragment();
            getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, notesFragment).commit();
        }
    });


}


public static void openDialog() {
    SchulfachDialog schulfachDialog = new SchulfachDialog();
    schulfachDialog.show(getSupportFragmentManager(), "ecameo");
}

}

AlertDialog 类:

public class SchulfachDialog extends AppCompatDialogFragment {
private EditText editTextName;


@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

    LayoutInflater inflater = getActivity().getLayoutInflater();
    View view = inflater.inflate(R.layout.popup_schulfach, null);

    builder.setView(view)
            .setTitle("Add new subject")
            .setMessage("Message")
            .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {

                }
            })
            .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {

                }
            });

    return builder.create();
}

}

timetableFragment(按钮所在的 fragment )

public class timetableFragment extends Fragment {
private static final String TAG = "todoFragment";


@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
    setRetainInstance(true);
    View rootview = inflater.inflate(R.layout.timetable_fragment, container, false);

    ImageButton btn_fach = getView().findViewById(R.id.btnSchulfach);
    btn_fach.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            MainActivity.openDialog();
        }
    });

    return rootview;


}

}

最佳答案

嘿,您创建的 SchulfachDialog 是一个 DialogFragment,而 DialogFragment 可以由 fragment 本身打开,因此您可以在 onClick 中使用 childFragmentManager 直接从 timetableFragment 打开对话框,

  btn_fach.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

              SchulfachDialog schulfachDialog = new SchulfachDialog();
              schulfachDialog.show(getChildFragmentManager(), "ecameo");

           }
        });

另外,

View rootview = inflater.inflate(R.layout.timetable_fragment, container, false);
ImageButton btn_fach = getView().findViewById(R.id.btnSchulfach); 

这里使用“rootview”而不是“getView()”,否则会给出 NullPointerException

关于java - 使用 fragment 上的按钮打开 AlertDialog,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55128312/

相关文章:

java - 线程加入与 ExecutorService.awaitTermination

android - 在约束布局中使用 NestedScrollView 的问题

android - 如何制作 Material Design 全屏对话框?

Android:为什么自定义按钮主题不适用于对话框?

java - 警告对话框消失

java - 通用构造函数的好处

java - Logback RollingFileAppender 没有写入正确的文件

java - 跨 Android 应用程序使用的自定义 View 和属性

android - Retrofit 中的@Query 和@path 有什么区别?

java - Android 显示 AlertDialog,无论用户 Activity 如何