使用片段按钮打开另一个活动

时间:2013-12-23 00:57:31

标签: java android button android-fragments

好的,所以我尝试了两种类型的代码来实现这一点,当我按下按钮进入另一个Activity时,它会一直强制关闭。我正在使用片段,片段代码中有一个按钮,但我似乎无法让它工作。我不是一位经验丰富的Android开发人员,但我正在努力学习。

这是Java代码:

第一种方法

public class About extends Fragment {

    Intent intent;

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

        View rootView = inflater.inflate(R.layout.about, container, false);

        intent = new Intent(getActivity(), Contact_Developer.class);
        final Button button = (Button) rootView.findViewById(R.id.btnContactDev);

        button.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                startActivity(intent);
            }
        });

        return rootView;
    }
}

第二种方法

public class About extends Fragment {

    public void onCreate (Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

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

        View rootView = inflater.inflate(R.layout.about, container, false);

        Button button = (Button) rootView.findViewById(R.id.btnContactDev);
        button.setOnClickListener(new View.OnClickListener() {

           @Override
           public void onClick(View arg0) {
              Intent intent = new Intent(getActivity(), Contact_Developer.class);
              getActivity().startActivity(intent);
           }
        });
        return rootView;
    }
}

我真的不知道发生了什么以及为什么我会强行关闭但是如果有人能帮助我并解释一下我做错了什么就足够了

5 个答案:

答案 0 :(得分:2)

不要处理片段中片段按钮的onClick。让它去做它的父母活动。并从父活动开始活动。

要确保按钮onClick事件已发送到父活动,请确保在about.xml中使用id btnContactDev按钮,您有以下参数:< / p>

<Button android:id="@+id/btnContactDev"
  android:onClick="buttonClick"
  ...
/>

并在您的父活动(About片段的父级)中,您有:

public void buttonClick(View v) {
  switch(v.getId()) {
    case R.id.btnContactDev:
      Intent myIntent = new Intent();
      myIntent.setClassName(your_package_name_string, your_activity_name_string);
      // for ex: your package name can be "com.example"
      // your activity name will be "com.example.Contact_Developer"
      startActivity(myIntent);
    break;
  }
}

HTH。

PS:此解决方案非常符合您的要求。通常,最好处理与片段类中的片段相关的onClick事件。

PS:是的,正如其他解决方案所说,请确保您已在Contact_Developer文件中注册了Manifest活动。

答案 1 :(得分:0)

您是否在AndroidManifest.xml中声明了正确的活动?应该在应用程序标记内声明除第一个之外的每个活动,如下所示:

<activity
   android:name=".Contact_Developer"
   android:label="@string/app_name" >
</activity>

如果没有找到,它会强行关闭。

答案 2 :(得分:0)

我认为这里的问题是活动尚未准备就绪。

即使有效,我也不建议您遵循harikris的解决方案。在XML文件中放置代码(onClick()处理click事件)通常是不好的做法。例如,将来很难将这段代码用于审查/更改它,而不是提及团队中的其他开发人员。

我建议您在Fragment课程中听取活动准备就绪的事件,即onActivityCreated()。覆盖相同方法的实现并在您的活动中调用某些内容,例如onFragmentReady(),如下例所示。

片段类

public class About extends Fragment {

    Intent intent;

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

        View rootView = inflater.inflate(R.layout.about, container, false);

        intent = new Intent(getActivity(), Contact_Developer.class);
        final Button button = (Button) rootView.findViewById(R.id.btnContactDev);

        button.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                startActivity(intent);
            }
        });

        return rootView;
    }

    @Override
        public void onActivityCreated (Bundle savedInstanceState) {
            super.onActivityCreated(savedInstanceState);

            ((MyActivity) this.getActivity()).onFragmentReady();
        } 
}  

活动类

public class MyActivity extends FragmentActivity {
    private void onFragmentReady() {
        Log.i(TAG, "testing");
         intent = new Intent(getActivity(), Contact_Developer.class);
         final Button button = (Button) rootView.findViewById(R.id.btnContactDev);

        button.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                startActivity(intent);
            }
        });
    }

    public class About extends Fragment {
        ...
    }
}

答案 3 :(得分:0)

我认为您应该使用getContext()getApplicationContext()而不是getActivity() 所以代码将是 Intent intent =new Intent(getContext(),Contact_Developer.class); startActivity(intent);

答案 4 :(得分:-1)

从片段中启动活动:

myButton.setOnClickListener((v) -> {
    Intent myIntent = new Intent(getActivity(), TargetActivity.class);
    startActivity(myIntent);
});