通过单击片段中的按钮来控制活动中按钮的setEnabled

时间:2019-09-02 01:40:24

标签: android android-fragments nullpointerexception

enter image description here

我正在制作一个具有1个主要活动和3个片段的应用程序。

在活动中,有一个片段显示另一个片段

通过在主要活动中单击按钮来更改它。

有一个带有按钮的片段。

我希望当按下片段中的按钮时,活动中的按钮将被禁用。

How to Enable/ Disable button from another fragment in android?

有类似的问答,所以我已经尝试过了。

UpdateButtonListener.java

public interface UpdateButtonListener {
    void onUpdate(boolean status);
}

MainActivity.java

public class MainActivity extends AppCompatActivity implements UpdateButtonListener{
public static UpdateButtonListener updateButton;
@Override
    public void onCreate(Bundle savedInstanceState) {
updateButton = this;
}

 @Override
    public void onUpdate(boolean status) {
        mBtn1.setEnabled(false);
        mBtn3.setEnabled(false);

    }
}

Fragment1.java

public class Fragment1 extends Fragment{
 public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
                             @Nullable Bundle savedInstanceState) {
View myView = inflater.inflate(R.layout.fragment_oper, container, false);

fBtn1 = (Button) myView.findViewById(R.id.fBtn1);
//fbtn1 = mStopBtn      
mStopBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View myView) {
                MainActivity.updateButton.onUpdate(false);
            }
        });

}

当我运行该应用程序时,出现错误

java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法'void android.widget.Button.setEnabled(boolean)'         在com.example.samplecode4_3demo.FragmentMain.onUpdate(MainActivity.java:379)         在com.example.samplecode4_3demo.FragmentOper $ 2.onClick(Fragment1.java:124)

我想这是因为我试图更改活动中的按钮。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

您是否已经尝试过yourbutton.setvisible(false)?

答案 1 :(得分:0)

问题

您尚未初始化变量。 mBtn1mBtn3为空,因为它们的设置不正确。

快速解决方案

初始化变量:

public class MainActivity extends AppCompatActivity implements UpdateButtonListener {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        updateButton = this;
        setContentView(R.layout.this_activity_layout); // Set layout with views
        mBtn1 = findViewById(R.id.btn1); // Find Button 1
        mBtn3 = findViewById(R.id.btn3); // Find Button 3
    }
}

完整解决方案

完成上述操作后,请阅读:https://developer.android.com/training/basics/fragments/communicating,了解如何通过片段正确地与活动进行交流。然后:

  1. 删除public static UpdateButtonListener updateButton;(您不应静态引用按钮)。
  2. 按以下方式单击更新片段按钮:

    mStopBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View myView) {
            // MainActivity.updateButton.onUpdate(false); // Don't access STATIC reference like this
    
            // Instead get the activity INSTANCE and invoke method on it
            UpdateButtonListener listener = (UpdateButtonListener) getActivity();
            if (listener != null) {
                listener.onUpdate(false);
            }
        }
    });
    

希望有帮助!