在片段中实现 onClickListener

Posted

技术标签:

【中文标题】在片段中实现 onClickListener【英文标题】:Implementing onClickListener in fragments 【发布时间】:2021-07-03 13:06:45 【问题描述】:

我正在将旧版 android 应用程序从使用不再受支持的 ViewPager 和已弃用的 ActionBar 更新为受支持的类。我很难在我的片段中实现 OnClickListeners 并创建视图。以前的公共类 myFragment 会扩展 Fragment 并实现 OnClickListener。

以下是我目前所拥有的。

public class myFragment extends Fragment 
Button btnOne;

@Override
public void onCreate(Bundle savedDataEntryInstanceState) 
    super.onCreate(savedDataEntryInstanceState);


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    View view = inflater.inflate(R.layout.my_fragment, container, false);
return view;


@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) 
    super.onViewCreated(view, savedInstanceState);
    fetchButtonClicks();


private void fetchButtonClicks()
    View view = inflater.inflate(R.layout.my_fragment, container, false);

   btnOne = (Button)view.findViewById(R.id.btnonexml);
   btnOne.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View view) 
            Toast.makeText(getActivity(), "BtnOne click event occurred.", Toast.LENGTH_LONG).show();
        
    );

问题在于在 fetchButtonClicks() 中实现视图。 两个问题:第一,关于查看创作,我在这里缺少什么,第二,有没有更好的方法来构建它?我在这个片段中有十几个按钮。提前致谢。

更新:下面的代码解决了我在片段中允许 OnClickListeners 的问题。这是我根据响应采用的结构。似乎很好地扩展到我的许多按钮。

public class dataEdit extends Fragment 
Button btnUpdateRecord, btnDeleteRecord, btnResetForm, btnFirstRecord, btnPreviousRecord,btnNextRecord, btnLastRecord, btnHelp, btnEditComment;
private Button btnSaveRecord = null; //Make above buttons private and equal null???
private View view = null;
private View v = null;


@Override
public void onCreate(Bundle savedDataEntryInstanceState) 
    super.onCreate(savedDataEntryInstanceState);
    setRetainInstance(true);


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    view = inflater.inflate(R.layout.data_edit, container, false);
    btnSaveRecord = (Button) view.findViewById(R.id.btnSaveRecordxml);
    btnUpdateRecord = (Button)view.findViewById(R.id.btnUpdateRecordxml);
    btnDeleteRecord = (Button)view.findViewById(R.id.btnDeleteRecordxml);
    btnResetForm = (Button)view.findViewById(R.id.btnResetFormxml);
    btnFirstRecord = (Button)view.findViewById(R.id.btnFirstRecordxml);
    btnPreviousRecord = (Button)view.findViewById(R.id.btnPreviousRecordxml);
    btnNextRecord = (Button)view.findViewById(R.id.btnNextRecordxml);
    btnLastRecord = (Button)view.findViewById(R.id.btnLastRecordxml);
    btnHelp = (Button)view.findViewById(R.id.btnDataEditHelpFilexml);
    btnEditComment = (Button)view.findViewById(R.id.btnEditCommentxml);

    return view;


@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) 
    super.onViewCreated(view, savedInstanceState);

    fetchButtonClicks();
 

private void fetchButtonClicks()
    btnSaveRecord.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View v) 
            saveRecord(v);
        
    );
    btnUpdateRecord.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View v) 
            updateRecord(v);
        
    );
    btnDeleteRecord.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View v) 
            deleteRecord(v);
        
    );
    btnResetForm.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View v) 
            resetForm();
        
    );
    btnFirstRecord.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View v) 
            firstRecord(v);
        
    );
    btnPreviousRecord.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View v) 
            previousRecord(v);
        
    );
    btnNextRecord.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View v) 
            nextRecord(v);
        
    );
    btnLastRecord.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View v) 
            lastRecord(v);
        
    );
    btnHelp.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View v) 
            showHelpDialog();
        
    );
    btnEditComment.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View v) 
            showCommentEditDialog();
        
    );
 

目前正在进行中:欢迎提出其他建议。谢谢。

【问题讨论】:

btnOne 在片段布局上?我看到你夸大了两种不同的观点 按钮位于该片段的选项卡上。我编辑了示例代码以反映这一点。感谢您了解这个。 AFAIK ViewPager 未被弃用。可能是支持结束了 【参考方案1】:

您不需要 Inflate 视图两次,只需将 View 传递到您的 fetchButtonClicks

private void fetchButtonClicks(View view)

   btnOne = (Button)view.findViewById(R.id.btnonexml);
   btnOne.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View view) 
            Toast.makeText(getActivity(), "BtnOne click event occurred.", Toast.LENGTH_LONG).show();
        
    );

在您的 onViewCreated() 方法上,只需像这样调用它:

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) 
    super.onViewCreated(view, savedInstanceState);
    fetchButtonClicks(view);

【讨论】:

在 logcat 中得到以下错误,codejava.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a在 androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:892) 在 androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManagerImpl. java:1238) 你能用 my_fragment.xml 更新你的 a=question 您是否在onViewCreate()onCreateView() 上拨打了fetchButtonClicks() 电话 最初是从“OnViewCreate”开始的,我也只是从“OnCreateView”尝试过,得到了同样的 logcat 错误。谢谢。 你确定这个方法被调用了!请检查一下【参考方案2】:

有效

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    View view = inflater.inflate(R.layout.fragment_test, container, false);



    button =  (Button)view.findViewById(R.id.btnonexml);
    button.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View v) 
            System.out.println("Klick");
        
    );
    return view;

【讨论】:

以上是关于在片段中实现 onClickListener的主要内容,如果未能解决你的问题,请参考以下文章

尝试在片段中实现 OnClick 侦听器 [重复]

在 recyclerview 片段中实现上下文操作模式的问题

在 webview 片段中实现后退按钮

从片段中获取意图值后,我如何在 recyclerview 项目中实现单击

如何使用对象列表在片段中实现newinstace模式[重复]

在 Navigation Drawer 的每个片段中实现不同的 Action Bar 项