【问题标题】:Start Activity within a fragment [duplicate]在片段中启动 Activity [重复]
【发布时间】:2016-01-10 10:04:52
【问题描述】:

当我单击 Tab1Discover 中的一个按钮时,我正在尝试启动一个新的 Tab1City 活动,这是一个片段。 我已经尝试了几个组合 if 参数,查看 stackoverflow,但它会不断编译并使应用程序在启动时崩溃,并带有:

java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)”

在 Tab1Discover.onCreateView(Tab1Discover.java:32)

public class Tab1Discover extends Fragment {

@InjectView(R.id.buttonLille)
Button _loginButton;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {


    _loginButton.setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View v) {
            // Start the Signup activity
            Intent intent = new Intent(getActivity(), Tab1City.class);
            startActivity(intent);
        }
    });


    return inflater.inflate(R.layout.tab_1_disc1_main, container, false);
}
}

【问题讨论】:

    标签: android button android-activity fragment onclicklistener


    【解决方案1】:

    编辑:

    我注意到(感谢评论)您正在使用 RoboGuice。在quick search 之后,我发现该引用仅在onViewCreated 中可用,所以将您的代码移到那里:

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
      return inflater.inflate(R.layout.tab_1_disc1_main, container, false);
    }
    
    
    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
      super.onViewCreated(view, savedInstanceState);
      _loginButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
          // Start the Signup activity
          Intent intent = new Intent(getActivity(), Tab1City.class);
          startActivity(intent);
        }
      });
    }
    

    【讨论】:

    • 他的@InjectView (R.id.idhere) CLASS varname; 完全有效。如果他使用@InjectView,他不应该在使用变量之前对xml进行膨胀吗?如果不是,那么可能只是 R.id.buttonLille 不存在。
    • @showp1984 感谢您的洞察力。我已经相应地更新了答案。
    • Android Studio 对我说类型不兼容,因为 _loginButton 是一个按钮,它发现 R.id.buttonLille 是一个视图
    • @AdrienChapelet 如果您要使用@InjectView,您将需要 RoboGuice。见:github.com/roboguice/roboguice
    • @AdrienChapelet 如果你在谈论我的旧答案,你需要使用... = (Button) ...
    【解决方案2】:

    根据您对“@InjectView”的使用,我猜您使用的是 ButterKnife 6.0.x。

    你错过了 ButterKnife 的一部分,你必须告诉它何时注入视图。

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.tab_1_disc1_main, container, false);
    
        ButterKnife.inject(this, rootView);
    
        _loginButton.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {
                // Start the Signup activity
                Intent intent = new Intent(getActivity(), Tab1City.class);
                startActivity(intent);
            }
        });
    
        return rootView;
    }
    

    使用此代码,您可以告诉 ButterKnife 在哪里可以找到视图,以便它可以设置绑定。从这里开始,你可以简单地添加所有你想要的@InjectView,它会自动处理绑定。

    【讨论】:

      【解决方案3】:

      非常感谢,现在可以了:

      public class Tab1Discover extends Fragment {
      
      @InjectView(R.id.buttonLille)
      Button _lilleButton;
      
      @Override
      public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
          View rootView = inflater.inflate(R.layout.tab_1_disc1_main, container, false);
      
          ButterKnife.inject(this, rootView);
      
          _lilleButton.setOnClickListener(new View.OnClickListener(){
              @Override
              public void onClick(View v) {
                  // Start the Signup activity
                  Intent intent = new Intent(getActivity(), Tab1City.class);
                  startActivity(intent);
              }
          });
      
          return rootView;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-01-29
        • 1970-01-01
        • 1970-01-01
        • 2019-12-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多