当前位置: 首页 > 知识库问答 >
问题:

尝试从主活动运行片段方法时出现NullPointerException

张建华
2023-03-14

我是使用片段的新手,我正在尝试从我的主要活动中执行片段方法,该方法比较文本视图,然后删除cookie并加载网站。

这就是我所拥有的:

在主活动中:

NavigatorFragment navigator = new NavigatorFragment();
navigator.refresh();

在片段中:

public void refresh(){
    if (!textView.getText().toString().equals("Click HERE")){
        cookieManager.removeAllCookie();
        cookieManager.removeSessionCookie();
        myWebView.loadUrl(URL);
    }
}

结果是:java。lang.NullPointerException:尝试调用虚拟方法“java”。lang.CharSequence android。小装置。文本视图。空对象引用上的getText()'

编辑

抱歉,但忘了提一下,虽然片段启动时发生了同样的事情,但我之前使用了以下代码来阻止片段重新启动:link,所以当我按BottomNavigationView的item4时,它会在onCreateView中打开片段:

textView = root.findViewById(R.id.textView);

当我再次按下它(没有更改片段)时,我希望执行该方法

我重复一遍,当我第一次按下项目4 BottomNavigationView时,它会打开片段4并加载其元素,当我第二次按下项目4时(没有更改片段),这就是我希望方法运行的时候

主要活动:

public class MainActivity extends AppCompatActivity {

/*
Fragment MyFragment;
private NavController navController;
 */
NavigatorFragment navigator = new NavigatorFragment();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    BottomNavigationView navigation = (BottomNavigationView) findViewById(R.id.nav_view);
    navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener);

    replace_fragment(new HomeFragment());
}

private void replace_fragment(Fragment fragment) {

    String tag = fragment.getClass().getSimpleName();
    FragmentTransaction tr = getSupportFragmentManager().beginTransaction();

    Fragment curFrag = getSupportFragmentManager().getPrimaryNavigationFragment();
    Fragment cacheFrag = getSupportFragmentManager().findFragmentByTag(tag);

    if (curFrag != null)
        tr.hide(curFrag);

    if (cacheFrag == null) {
        tr.add(R.id.nav_host_fragment, fragment, tag);
    } else {
        tr.show(cacheFrag);
        fragment = cacheFrag;
    }

    tr.setPrimaryNavigationFragment(fragment);
    tr.commit();

}

private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
        = new BottomNavigationView.OnNavigationItemSelectedListener() {

    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()) {
            case R.id.navigation_home:
                replace_fragment(new HomeFragment());
                if (!getSupportActionBar().isShowing()){
                    showBar();
                }
                return true;

            case R.id.navigation_schedule:
                replace_fragment(new ScheduleFragment());
                if (!getSupportActionBar().isShowing()){
                    showBar();
                }
                return true;

            case R.id.navigation_calculators:
                replace_fragment(new CalculatorsFragment());
                if (!getSupportActionBar().isShowing()){
                    showBar();
                }
                return true;

            case R.id.navigation_navigator:
                replace_fragment(new NavigatorFragment());
                if (!getSupportActionBar().isShowing()){
                    navigator.refresh();//**************PROBLEM HERE******************************************
                }
                hideBar();
                return true;
        }
        return false;
    }
};



public void hideBar(){
    if (Build.VERSION.SDK_INT >= 19) {
        // Call some material design APIs here
        Objects.requireNonNull(getSupportActionBar()).hide();
    }
    else {
        // Implement this feature without material design
        getSupportActionBar().hide();
    }
}

public void showBar(){
    if (Build.VERSION.SDK_INT >= 19) {
        // Call some material design APIs here
        Objects.requireNonNull(getSupportActionBar()).show();
    }
    else {
        // Implement this feature without material design
        getSupportActionBar().show();
    }
}

}

**如果从片段代码运行,刷新方法可以工作

共有1个答案

祝嘉懿
2023-03-14

当使用新的NavigatorFragment()实例化片段实例时,不涉及片段生命周期的开始。这意味着片段没有被创建、启动、恢复和显示在屏幕上。。因此,此时访问片段的视图将返回NullPointerException。

因此,您需要做的是在活动布局中为片段设置一个占位符,并通过在此占位符中添加或替换片段来启动片段事务,这使得片段通过其所有生命周期回调方法,并给它一个机会在onCreateView()生命周期回调中的屏幕上创建其视图(布局),在这里您可以只允许访问底层TextView或此片段中的任何其他视图,并使用它们的方法,例如在您的情况下text View.getText()随后没有NullPointerException

在这里,您可以找到如何正确使用片段。

 类似资料:
  • 我在片段类中有方法。我想从主活动中调用该方法,但不想使用FragmentById(或)FragmentByTag。 我的碎片方法: 如何在不使用FragmentById(或)FragmentByTag的情况下从主活动调用上述方法?

  • fragment类主活动/主活动如何限制我的主活动在从片段的最后一页返回到主活动时不返回到片段的最后一页,就像我有一个主活动,单击按钮该主活动会导致另外3个活动,其中一个活动有片段。片段的最后一页指向home activity,但当我在home activity上后退时,它再次将我引导到片段的最后一页,然后我再次按下back按钮,然后我的应用程序关闭

  • 如何限制我的主要活动不返回片段的最后一页,一旦从片段的最后一页返回到主要活动,就像我有一个主活动一样,单击按钮,该主活动会导致另外3个活动,其中一个活动有片段。片段的最后一页指向home activity,但当我在home activity上后退时,它再次将我引导到片段的最后一页,然后我再次按下back按钮,然后我的应用程序关闭 我的主要活动课 公共类主页扩展应用程序活动{ } 我零星的寻呼机 公

  • 这是我的场景: 我在我的活动中有ViewPager,其中包含6个片段。我用手指滑动来禁用分页,所以每当我想滑动时,我使用相关的按钮和: 在每一个swipe片段中(swipe完成后),我希望向服务器发送一个GET请求,并获取一些数据并在该片段中显示它。因为这样做: 答:Daniel Nugent的代码运行良好,除了在发送GET请求时显示ProgressDialog之外,我使用了: 这段代码也返回Nu

  • 问题内容: 我刚刚开始学习Java,并且只知道少量的代码,但是,这仍然是一个简单的程序。它更多是一个恶作剧程序,但主要只是为了测试我是否可以创建一个jar文件。 这是代码: 我将其保存到名为的文件中,然后使用进行编译 这有效,当我使用运行它时 它也可以正常工作。 因此,然后我尝试创建一个jar文件。我使用命令 而且有效。之后,我双击jar文件,它出现一个错误。 所以我在cmd中运行它 并得到这个错