Java 如何从选项卡式片段创建自定义alertDialog?

Java 如何从选项卡式片段创建自定义alertDialog?,java,android,android-studio,Java,Android,Android Studio,问题: public class GroupFragment extends Fragment implements AddGroupDialog.AddGroupDialogListener { private Button addGroupButton; private TextView textViewNoGroups; @Override public View onCreateView(L

问题:

       public class GroupFragment extends Fragment implements AddGroupDialog.AddGroupDialogListener {
    
        private Button addGroupButton;
        private TextView textViewNoGroups;
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            // Inflate the layout for this fragment
            View view = inflater.inflate(R.layout.fragment_group, container, false);
    
            addGroupButton = view.findViewById(R.id.addGroupButton);
            textViewNoGroups = view.findViewById(R.id.textViewNoGroups);
    
            addGroupButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    addNewGroupDialog();
                }
            });
    
            scaleAnimation(addGroupButton);
    
            return view;
        }
    
        private void scaleAnimation(View v){
            Animator scale = ObjectAnimator.ofPropertyValuesHolder(v,
                    PropertyValuesHolder.ofFloat(View.SCALE_X, 0, 1.2f, 1),
                    PropertyValuesHolder.ofFloat(View.SCALE_Y, 0, 1.2f, 1)
            );
            scale.setDuration(600);
            scale.start();
        }
    
        private void addNewGroupDialog(){
            AddGroupDialog dialog = new AddGroupDialog();
            assert getFragmentManager() != null;
            dialog.show(getFragmentManager(), "add new group dialog");
        }
    
        @Override
        public void applyString(String groupName) {
            textViewNoGroups.setText(groupName);
        }
    }
    
public class AddGroupDialog extends AppCompatDialogFragment {

    
        private EditText editTextGroupName;
        private AddGroupDialogListener listener;
    
        @NonNull
        @Override
        public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
    
            AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    
            LayoutInflater inflater = getActivity().getLayoutInflater();
            View view = inflater.inflate(R.layout.layout_add_new_group_dialog, null);
    
            builder.setView(view)
                    .setTitle("")
                    .setPositiveButton(R.string.confirm, new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {
                            String groupName = editTextGroupName.getText().toString();
                            listener.applyString(groupName);
                        }
                    });
    
            editTextGroupName = view.findViewById(R.id.editTextGroupName);
            return builder.create();
        }
    
        @Override
        public void onAttach(@NonNull Context context) {
            super.onAttach(context);
    
            try {
                listener = (AddGroupDialogListener) context;
            } catch (ClassCastException e){
                throw new ClassCastException(context.toString() +
                        "Must implement AddGroupDialogListener");
            }
        }
    
        public interface AddGroupDialogListener{
            void applyString(String groupName);
        }
    
    }
    
    public class MainActivity extends AppCompatActivity{
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            SectionsPagerAdapter sectionsPagerAdapter = new SectionsPagerAdapter(this, getSupportFragmentManager());
            ViewPager viewPager = findViewById(R.id.view_pager);
            viewPager.setAdapter(sectionsPagerAdapter);
            TabLayout tabs = findViewById(R.id.tabs);
            tabs.setupWithViewPager(viewPager);
    
        }
    }
public class SectionsPagerAdapter extends FragmentPagerAdapter {

    @StringRes
    private static final int[] TAB_TITLES = new int[]{R.string.tab_text_1, R.string.tab_text_2, R.string.tab_text_3};
    private final Context mContext;

    public SectionsPagerAdapter(Context context, FragmentManager fm) {
        super(fm);
        mContext = context;
    }

    @Override
    public Fragment getItem(int position) {
        Fragment fragment = null;

        switch (position){
            case 0:
                fragment = new GroupFragment();
                break;
            case 1:
                fragment = new AttendanceFragment();
                break;
            case 2:
                fragment = new StatisticsFragment();
                break;
        }
        return fragment;
    }

    @Nullable
    @Override
    public CharSequence getPageTitle(int position) {
        return mContext.getResources().getString(TAB_TITLES[position]);
    }

    @Override
    public int getCount() {
        return TAB_TITLES.length;
    }
}
java.lang.ClassCastException: com.example.attendencetaker.MainActivity@26602bcMust implement AddGroupDialogListener
在按下选项卡片段中的按钮后,我试图打开一个自定义对话框。 似乎我的MainActivity活动被发送到对话框,而我希望我的选项卡式片段(GroupFragment)被发送,这样我就可以更改这个片段中的editText(现在)

代码:

       public class GroupFragment extends Fragment implements AddGroupDialog.AddGroupDialogListener {
    
        private Button addGroupButton;
        private TextView textViewNoGroups;
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            // Inflate the layout for this fragment
            View view = inflater.inflate(R.layout.fragment_group, container, false);
    
            addGroupButton = view.findViewById(R.id.addGroupButton);
            textViewNoGroups = view.findViewById(R.id.textViewNoGroups);
    
            addGroupButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    addNewGroupDialog();
                }
            });
    
            scaleAnimation(addGroupButton);
    
            return view;
        }
    
        private void scaleAnimation(View v){
            Animator scale = ObjectAnimator.ofPropertyValuesHolder(v,
                    PropertyValuesHolder.ofFloat(View.SCALE_X, 0, 1.2f, 1),
                    PropertyValuesHolder.ofFloat(View.SCALE_Y, 0, 1.2f, 1)
            );
            scale.setDuration(600);
            scale.start();
        }
    
        private void addNewGroupDialog(){
            AddGroupDialog dialog = new AddGroupDialog();
            assert getFragmentManager() != null;
            dialog.show(getFragmentManager(), "add new group dialog");
        }
    
        @Override
        public void applyString(String groupName) {
            textViewNoGroups.setText(groupName);
        }
    }
    
public class AddGroupDialog extends AppCompatDialogFragment {

    
        private EditText editTextGroupName;
        private AddGroupDialogListener listener;
    
        @NonNull
        @Override
        public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
    
            AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    
            LayoutInflater inflater = getActivity().getLayoutInflater();
            View view = inflater.inflate(R.layout.layout_add_new_group_dialog, null);
    
            builder.setView(view)
                    .setTitle("")
                    .setPositiveButton(R.string.confirm, new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {
                            String groupName = editTextGroupName.getText().toString();
                            listener.applyString(groupName);
                        }
                    });
    
            editTextGroupName = view.findViewById(R.id.editTextGroupName);
            return builder.create();
        }
    
        @Override
        public void onAttach(@NonNull Context context) {
            super.onAttach(context);
    
            try {
                listener = (AddGroupDialogListener) context;
            } catch (ClassCastException e){
                throw new ClassCastException(context.toString() +
                        "Must implement AddGroupDialogListener");
            }
        }
    
        public interface AddGroupDialogListener{
            void applyString(String groupName);
        }
    
    }
    
    public class MainActivity extends AppCompatActivity{
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            SectionsPagerAdapter sectionsPagerAdapter = new SectionsPagerAdapter(this, getSupportFragmentManager());
            ViewPager viewPager = findViewById(R.id.view_pager);
            viewPager.setAdapter(sectionsPagerAdapter);
            TabLayout tabs = findViewById(R.id.tabs);
            tabs.setupWithViewPager(viewPager);
    
        }
    }
public class SectionsPagerAdapter extends FragmentPagerAdapter {

    @StringRes
    private static final int[] TAB_TITLES = new int[]{R.string.tab_text_1, R.string.tab_text_2, R.string.tab_text_3};
    private final Context mContext;

    public SectionsPagerAdapter(Context context, FragmentManager fm) {
        super(fm);
        mContext = context;
    }

    @Override
    public Fragment getItem(int position) {
        Fragment fragment = null;

        switch (position){
            case 0:
                fragment = new GroupFragment();
                break;
            case 1:
                fragment = new AttendanceFragment();
                break;
            case 2:
                fragment = new StatisticsFragment();
                break;
        }
        return fragment;
    }

    @Nullable
    @Override
    public CharSequence getPageTitle(int position) {
        return mContext.getResources().getString(TAB_TITLES[position]);
    }

    @Override
    public int getCount() {
        return TAB_TITLES.length;
    }
}
java.lang.ClassCastException: com.example.attendencetaker.MainActivity@26602bcMust implement AddGroupDialogListener
错误:

       public class GroupFragment extends Fragment implements AddGroupDialog.AddGroupDialogListener {
    
        private Button addGroupButton;
        private TextView textViewNoGroups;
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            // Inflate the layout for this fragment
            View view = inflater.inflate(R.layout.fragment_group, container, false);
    
            addGroupButton = view.findViewById(R.id.addGroupButton);
            textViewNoGroups = view.findViewById(R.id.textViewNoGroups);
    
            addGroupButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    addNewGroupDialog();
                }
            });
    
            scaleAnimation(addGroupButton);
    
            return view;
        }
    
        private void scaleAnimation(View v){
            Animator scale = ObjectAnimator.ofPropertyValuesHolder(v,
                    PropertyValuesHolder.ofFloat(View.SCALE_X, 0, 1.2f, 1),
                    PropertyValuesHolder.ofFloat(View.SCALE_Y, 0, 1.2f, 1)
            );
            scale.setDuration(600);
            scale.start();
        }
    
        private void addNewGroupDialog(){
            AddGroupDialog dialog = new AddGroupDialog();
            assert getFragmentManager() != null;
            dialog.show(getFragmentManager(), "add new group dialog");
        }
    
        @Override
        public void applyString(String groupName) {
            textViewNoGroups.setText(groupName);
        }
    }
    
public class AddGroupDialog extends AppCompatDialogFragment {

    
        private EditText editTextGroupName;
        private AddGroupDialogListener listener;
    
        @NonNull
        @Override
        public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
    
            AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    
            LayoutInflater inflater = getActivity().getLayoutInflater();
            View view = inflater.inflate(R.layout.layout_add_new_group_dialog, null);
    
            builder.setView(view)
                    .setTitle("")
                    .setPositiveButton(R.string.confirm, new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {
                            String groupName = editTextGroupName.getText().toString();
                            listener.applyString(groupName);
                        }
                    });
    
            editTextGroupName = view.findViewById(R.id.editTextGroupName);
            return builder.create();
        }
    
        @Override
        public void onAttach(@NonNull Context context) {
            super.onAttach(context);
    
            try {
                listener = (AddGroupDialogListener) context;
            } catch (ClassCastException e){
                throw new ClassCastException(context.toString() +
                        "Must implement AddGroupDialogListener");
            }
        }
    
        public interface AddGroupDialogListener{
            void applyString(String groupName);
        }
    
    }
    
    public class MainActivity extends AppCompatActivity{
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            SectionsPagerAdapter sectionsPagerAdapter = new SectionsPagerAdapter(this, getSupportFragmentManager());
            ViewPager viewPager = findViewById(R.id.view_pager);
            viewPager.setAdapter(sectionsPagerAdapter);
            TabLayout tabs = findViewById(R.id.tabs);
            tabs.setupWithViewPager(viewPager);
    
        }
    }
public class SectionsPagerAdapter extends FragmentPagerAdapter {

    @StringRes
    private static final int[] TAB_TITLES = new int[]{R.string.tab_text_1, R.string.tab_text_2, R.string.tab_text_3};
    private final Context mContext;

    public SectionsPagerAdapter(Context context, FragmentManager fm) {
        super(fm);
        mContext = context;
    }

    @Override
    public Fragment getItem(int position) {
        Fragment fragment = null;

        switch (position){
            case 0:
                fragment = new GroupFragment();
                break;
            case 1:
                fragment = new AttendanceFragment();
                break;
            case 2:
                fragment = new StatisticsFragment();
                break;
        }
        return fragment;
    }

    @Nullable
    @Override
    public CharSequence getPageTitle(int position) {
        return mContext.getResources().getString(TAB_TITLES[position]);
    }

    @Override
    public int getCount() {
        return TAB_TITLES.length;
    }
}
java.lang.ClassCastException: com.example.attendencetaker.MainActivity@26602bcMust implement AddGroupDialogListener

我希望我对这个问题的解释是清楚的。谢谢大家!

使活动实现您的接口等,然后使用片段上的方法将所有数据传递给片段。您将需要对显示的实际片段的引用

在片段中添加类似于以下内容的方法:

public void updateData(字符串数据){
editText.setText(数据);
}
在“活动”中接口的重写方法中:

@覆盖
公共无效更新(字符串数据){
fragment.updateData(数据);
}
更新 请改用此适配器:

public class SectionTabAdapter extends FragmentPagerAdapter {
    
    private ArrayList<Fragment> fragments = new ArrayList<>();
    private ArrayList<String> titles = new ArrayList<>();
    
    public SectionTabAdapter(@NonNull FragmentManager fm, int behavior) {
        super(fm, behavior);
    }
    
    public void addFragment(Fragment fragment, String title) {
        fragments.add(fragment);
        titles.add(title);
    }

    @NonNull
    @Override
    public Fragment getItem(int position) {
        return fragments.get(position);
    }

    @Override
    public int getCount() {
        return fragments.size();
    }

    @Nullable
    @Override
    public CharSequence getPageTitle(int position) {
        return titles.get(position);
    }
}

更改
listener=(AddGroupDialogListener)上下文
to
listener=(AddGroupDialogListener)getParentFragment()。您可能还想将
ClassCastException
消息的
context.toString()
更改为
getParentFragment().toString()
。我认为它可以工作,但现在它说侦听器为空。@MikeM。dialog不是GroupFragment的子对象,因此getParentFragment方法返回空值。有什么建议吗?抱歉,我误读了部分代码。还可以更改dialog.show(getFragmentManager(),…)
line改为使用
getChildFragmentManager()
。我知道这一点,但我需要使用GroupFragment来更改其UI。第一种方法放在片段中,第二种方法放在活动中。在您创建片段的某个地方,您需要保存对它的引用,并在该位置调用第二个方法,如第二个方法所示,该方法可以解决该问题,知道在巫婆状态下(在某些情况下)我可以做到吗?只要片段对象存在并且创建了视图,您就可以调用该方法。但是,如果您不确定,只需将方法1的内部包装在一个文件中,我如何保存片段对象?我在onCreate inside MainActivity:
groupFragment=(groupFragment)部分SpagerAdapter.getItem(0)中尝试了这一点;attendanceFragment=(attendanceFragment)节SpagerAdapter.getItem(1);statisticsFragment=(statisticsFragment)sectionsPagerAdapter.getItem(2)