Android - 如何从片段中的其他方法访问在 onCreateView() 中实例化的 RelativeLayout

Android - How can I access a RelativeLayout instantiated in onCreateView() from an other method in a Fragment

我希望当用户点击后退按钮时相关布局消失

在我的 onCreateView() 方法中,我正在实例化一个 RelativeLatout 视图:

VerbFragment

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    final View rootView = inflater.inflate(R.layout.fragment_verbs,container, false);
    relativeLayout = (RelativeLayout)rootView.findViewById(R.id.rlListVerb);
    relativeLayout.setVisibility(View.GONE);

我想从其他方法 (backButtonWasPressed()) 访问亲戚

public void backButtonWasPressed() {
        Log.d("hi ", "back is pressed");

        if (!visible) {

            relativeLayout.setVisibility(View.GONE);

        } else relativeLayout.setVisibility(View.VISIBLE);
    }

按下后退按钮时在 MainActivity2 中调用此方法:

MainActivity2

 @Override
    public void onBackPressed() {

            VerbFragment fragment = new VerbFragment();
            fragment.backButtonWasPressed();

    }

但我收到此错误:

 java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.RelativeLayout.setVisibility(int)' on a null object reference
at Fragments.VerbFragment.backButtonWasPressed(VerbFragment.java:258)
at Activitys.MainActivity2.onBackPressed(MainActivity2.java:136)

在你的 relativeLayout 上使用:

relativeLayout.setId(IntValueHere);

您可以制作一个全局相对布局变量:

private RelativeLayout myLayout;

现在,在设置 id 后将创建的 RelativeLayout 分配给 myLayout:

myLayout = relativeLayout;

最后,在您的 backButtonWasPressed(){} 中,您可以访问 myLayout 引用,它应该没问题。

或者,您可以给 backButtonWasPressed 一个 relativeLayout 参数,并将您的 "relativeLayout" 传递给它。

给你的 backButtonWasPressed 一个 RelativeLayout 的参数

public void backButtonWasPressed(RelativeLayout layoutToTake){
    if(!visible){
        layoutToTake.setVisibility(View.GONE);
    }    
}

似乎是因为 backButtonWasPressed()MainActivity2 而不是 VerbFragment 调用。在这种情况下 relativeLayout 变量可以是 null。您可以通过检查 VerbFragment 的可见性来避免这种情况,例如:

    public void backButtonWasPressed() {
            Log.d("hi ", "back is pressed");

            if (getView() == null || !isMenuVisible()) {
                return;
            }

            if (!visible) {

                relativeLayout.setVisibility(View.GONE);

            } else relativeLayout.setVisibility(View.GONE);
        }

将片段添加到 Activity 时,它有一个 标签 参数。

fragmentTransaction.add(R.id.container, fragment, tag);

现在,在您的 Activity 的 backButtonWasPressed() 方法中,您可以使用标签找到该片段,如果它不为空,则调用 backButtonWasPressed()片段.

FragmentManager fragmentManager = getSupportFragmentManager();
Fragment verbFragment = fragmentManager.findFragmentByTag(fragmentTag);
if(verbFragment !=null && verbFragment .isVisible()){
    verbFragment .backButtonWasPressed();
}