在片段中启动 Activity [重复]

Posted

技术标签:

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

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

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);


【问题讨论】:

【参考方案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;

【讨论】:

以上是关于在片段中启动 Activity [重复]的主要内容,如果未能解决你的问题,请参考以下文章

从 Activity 的 Fragment 中保存数据

Android非UI片段使用[重复]

在 Activity 内部,如何暂停 for 循环以调用片段,然后在按钮单击片段后恢复循环以重新开始

java [Intent] Intent片段以启动Activity,Service或发送广播。 #android_snippet #android

关于Activity和Fragment生命周期的问题

Intent 不会从 Fragment 启动 Activity