使用 Fragment 上的按钮打开 AlertDialog
Open AlertDialog with button on Fragment
我尝试在 MainActivity 中的 3 个片段之一上打开带有图像按钮的 AlertDialog,但我总是遇到 2 个问题中的 1 个。
- 无法从非静态上下文中引用方法 openDialog()
- 。无法从静态上下文中引用非静态方法 'getSupportFragmentManager()'
我尝试了几种不同的方法,但它们都有这样的问题。
我的目标是让 timetableFragment.java 上的 ImageButton 打开一个对话框。目前我已经为 AlertDialog 创建了一个额外的 class。
我是初学者,请尽量保持简单。
我的主要活动:
public class 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");
}
}
AlertDialogClass:
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(按钮所在的片段)
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可以通过一个片段自己打开,所以你可以直接从你的timetableFragment中使用childFragmentManager在onClick中打开对话框,
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
我尝试在 MainActivity 中的 3 个片段之一上打开带有图像按钮的 AlertDialog,但我总是遇到 2 个问题中的 1 个。
- 无法从非静态上下文中引用方法 openDialog()
- 。无法从静态上下文中引用非静态方法 'getSupportFragmentManager()'
我尝试了几种不同的方法,但它们都有这样的问题。
我的目标是让 timetableFragment.java 上的 ImageButton 打开一个对话框。目前我已经为 AlertDialog 创建了一个额外的 class。
我是初学者,请尽量保持简单。
我的主要活动:
public class 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");
}
}
AlertDialogClass:
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(按钮所在的片段)
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可以通过一个片段自己打开,所以你可以直接从你的timetableFragment中使用childFragmentManager在onClick中打开对话框,
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