【问题标题】:How to start an activity with a button from a fragment?如何使用片段中的按钮启动活动?
【发布时间】:2015-02-22 03:54:12
【问题描述】:

我有一个带有浮动操作按钮的片段,我想在按下该按钮时启动一个活动。这是我要启动的片段的代码:

package com.nhscoding.safe2tell;

import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;


public class LEARN extends Fragment {


    View rootview;

    private OnFragmentInteractionListener mListener;




    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        rootview = inflater.inflate(R.layout.fragment_learn, container, false);
        return rootview;
    }

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

        final Button subTip = (Button) getActivity().findViewById(R.id.subTip);
        subTip.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent (v.getContext(),SUBMIT_TIP.class);
                startActivityForResult(intent,0);
            }
        });
    }

    public void onButtonPressed(Uri uri) {
        if (mListener != null) {
            mListener.onFragmentInteraction(uri);
        }
    }

    @Override
    public void onDetach() {
        super.onDetach();
        mListener = null;
    }

    public static LEARN newInstance() {
        LEARN fragment = new LEARN();
        Bundle args = new Bundle();
        fragment.setArguments(args);

        return fragment;


    }
    public interface OnFragmentInteractionListener {
        // TODO: Update argument type and name
        public void onFragmentInteraction(Uri uri);
    }



//public class Stuff extends Activity {
//    Button submit_tip = (Button) findViewById(R.id.submit_tip);
//    submit_tip.setOnClickListener(new View.OnClickListener() {
//        public void onClick(View v) {
//            Intent intent = new Intent(v.getContext(), SUBMIT_TIP.class);
//            startActivityForResult(intent,0);
//        }
}

这会在 findViewById 上返回错误,因为它不能在片段中使用,只能在活动中使用。我需要将其更改为活动还是有其他方法可以完成此操作?

【问题讨论】:

    标签: android user-interface android-fragments android-studio findviewbyid


    【解决方案1】:

    FragmentonCreate() 方法中获取对View 的引用将不起作用,因为Fragment 的布局尚未膨胀。

    你需要做的就是替换

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
        final Button subTip = (Button) getActivity().findViewById(R.id.subTip);
        subTip.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent (v.getContext(),SUBMIT_TIP.class);
                startActivityForResult(intent,0);
            }
        });
    }
    

    用这个:

    @Override
    public void onViewCreated (View view, Bundle savedInstanceState){
    
        final FloatingActionButton subTip = (FloatingActionButton) view.findViewById(R.id.subTip);
        subTip.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent (v.getContext(),SUBMIT_TIP.class);
                startActivityForResult(intent,0);
            }
        });
    }
    

    试试这个。这将起作用。

    【讨论】:

    【解决方案2】:

    使用rootview 从 Fragment 布局访问 Button:

        final Button subTip = (Button) rootview.findViewById(R.id.subTip);
    

    注意: getActivity() 返回添加当前 Fragment 的主 Activity 上下文,因此如果我们调用 rootview.findViewById 意味着我们正在从 Activity 布局而不是 Fragment 访问视图

    【讨论】:

    • @user3566841 :在日志中使用 FloatingActionButton 而不是 Button
    【解决方案3】:

    你可以用这个。您可以通过getActivity 获取您当前的活动。

    @Override
    public void onViewCreated (View rootView, Bundle savedInstanceState){
    final Button b= (Button) rootView.findViewById(R.id.b);
    b.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent (v.getContext(),yourActivity.class);
            startActivityForResult(intent,0);
        }
    }
    
    );
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多