【问题标题】:How to open a Fragment on button click from a fragment in Android如何从Android中的片段单击按钮打开片段
【发布时间】:2015-12-18 11:36:20
【问题描述】:

我的 HomeFragment 上有一些按钮,我想在从片段单击按钮时打开片段。类似导航的东西。我正在尝试使用以下代码,但没有奏效。请帮忙 !我对 android 很陌生,正在尝试学习新事物。

这是我的代码

import android.app.Fragment;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;

public class HomeFragment extends Fragment {

    public HomeFragment(){}



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

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

        Button aboutBtn = (Button) rootView.findViewById(R.id.aboutusButton);
        Button phonebookBtn = (Button) rootView.findViewById(R.id.phbookButton);
        Button schemeBtn = (Button) rootView.findViewById(R.id.schemeButton);
        Button loanBtn = (Button) rootView.findViewById(R.id.loanButton);
        Button serviceBtn = (Button) rootView.findViewById(R.id.serviceButton);
        Button devBtn = (Button) rootView.findViewById(R.id.devButton);

        aboutBtn.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v)
            {
                // Launching new Activity on selecting single List Item
                Intent i = new Intent(getActivity(), AboutFragment.class);
                startActivity(i);
            }
        });

        phonebookBtn.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v)
            {
                // Launching new Activity on selecting single List Item
                Intent j = new Intent(getActivity(), PhoneBookFragment.class);
                startActivity(j);
            }
        });

        schemeBtn.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v)
            {
                // Launching new Activity on selecting single List Item
                Intent k = new Intent(getActivity(), HomeFragment.class);
                startActivity(k);
            }
        });

        loanBtn.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v)
            {
                // Launching new Activity on selecting single List Item
                Intent l = new Intent(getActivity(), RemittanceFragment.class);
                startActivity(l);
            }
        });

        serviceBtn.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v)
            {
                // Launching new Activity on selecting single List Item
                Intent m = new Intent(getActivity(), ServiceFragment.class);
                startActivity(m);
            }
        });

        devBtn.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v)
            {
                // Launching new Activity on selecting single List Item
                Intent n = new Intent(getActivity(), AboutDeveloper.class);
                startActivity(n);
            }
        });


        return rootView;
    }
}

我正在寻找类似波纹管代码的东西,但不知道如何使代码与我的代码一起使用。

Button aboutBtn = (Button) v.findViewById(R.id.aboutButton);
aboutBtn.setOnClickListener(this);

Button homeBtn = (Button) v.findViewById(R.id.homeButton);
homeButton.setOnClickListener(this);

Button serviceBtn = (Button) v.findViewById(R.id.serviceButton);
serviceBtn.setOnClickListener(this);

@Override
public void onClick(View view) {
    Fragment fragment = null;
    switch (view.getId()) {
        case aboutButton:
            fragment = new AboutFragment();
            break;

        case homeBtn:
            fragment = new PhonebookFragment();
            break;

        case serviceBtn:
            fragment = new ServiceFragment();
            break;

        default:
            fragment = new HomeFragment();
            break;

    }
}

【问题讨论】:

    标签: android android-fragments android-intent


    【解决方案1】:

    您可以在单击按钮时使用 FragmentTransaction 替换片段。像这样的:

      Fragment someFragment = new SomeFragment(); 
        FragmentTransaction transaction = getFragmentManager().beginTransaction();
        transaction.replace(R.id.fragment_container, someFragment ); // give your fragment container id in first parameter
        transaction.addToBackStack(null);  // if written, this transaction will be added to backstack
        transaction.commit(); 
    

    了解performing fragment transactions here.

    代码:

      package com.rupomkhondaker.sonalibank;
    
    import android.app.Fragment;
    import android.app.FragmentTransaction;
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.Button;
    
    public class HomeFragment extends Fragment implements View.OnClickListener {
    
        public HomeFragment() {
        }
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
    
            View rootView = inflater.inflate(R.layout.fragment_home, container, false);
    
            Button aboutBtn = (Button) rootView.findViewById(R.id.aboutusButton);
            Button phonebookBtn = (Button) rootView.findViewById(R.id.phbookButton);
    
            aboutBtn.setOnClickListener(this);
            phonebookBtn.setOnClickListener(this);
    
    
            return rootView;
        }
    
        @Override
        public void onClick(View view) {
            Fragment fragment = null;
            switch (view.getId()) {
                case R.id.aboutusButton:
                    fragment = new AboutFragment();
                    replaceFragment(fragment);
                    break;
    
                case R.id.phbookButton:
                    fragment = new PhoneBookFragment();
                    replaceFragment(fragment);
                    break;
            }
        }
    
        public void replaceFragment(Fragment someFragment) {
            FragmentTransaction transaction = getFragmentManager().beginTransaction();
            transaction.replace(R.id.frame_container, someFragment);
            transaction.addToBackStack(null);
            transaction.commit();
        }
    
    
    }
    

    【讨论】:

    • 你能在我的代码中给我一个示例实现吗?
    • @Firefog 请看。
    • @Firefog “不工作”是什么意思?它是抛出错误还是其他什么?请详细写。
    • fragment_container ?显示红线也每个案例显示红线
    • @Firefog 您需要将片段容器 ID 放在那里,正如我在评论中所写的那样。如果你不知道它在哪里,那就把你的活动的 xml 放在有问题的地方。
    【解决方案2】:

    我有一个简单的技巧!这是 MainActivity 中的代码:

    Intent intent=new Intent(getApplicationContext(),Main2Activity.class);
            intent.putExtra("pos",1);
            startActivity(intent);
    
    Intent intent1=new Intent(getApplicationContext(),Main2Activity.class);
            intent1.putExtra("pos",2);
            startActivity(intent1);
    

    在 Main2Activity 中,它是一个带有片段的 NavigationDrawer

    Bundle extras;
      extras=getIntent().getExtras();
            if(extras!=null)
            {
                position=extras.getInt("pos");
                if(position==1)
                {
                    fragment=new FragmentOne();
    
                    if(fragment !=null)
                    {
                        android.support.v4.app.FragmentManager fragmentManager=getSupportFragmentManager();
                        FragmentTransaction fragmentTransaction=fragmentManager.beginTransaction();
                        fragmentTransaction.replace(R.id.screen_area,fragment);
                        fragmentTransaction.commit();
                    }
                }
                if(position==2)
                {
                    fragment=new FragmentTwo();
    
                    if(fragment !=null)
                    {
                        android.support.v4.app.FragmentManager fragmentManager=getSupportFragmentManager();
                        FragmentTransaction fragmentTransaction=fragmentManager.beginTransaction();
                        fragmentTransaction.replace(R.id.screen_area,fragment);
                        fragmentTransaction.commit();
                    }
                }
            }
    

    【讨论】:

      【解决方案3】:

      Kotlin 示例:

      fun FragmentActivity.replaceFragment(fragment: Fragment, frameId: Int = R.id.fragment_container, addToStack: Boolean) {
      val doesFragmentAlreadyExists = supportFragmentManager.findFragmentByTag(fragment.javaClass.simpleName) != null
      if (!doesFragmentAlreadyExists) {
          supportFragmentManager.inTransaction {
              if (addToStack) replace(frameId, fragment, fragment.javaClass.simpleName)
                  .addToBackStack(fragment.javaClass.simpleName)
              else
                  replace(frameId, fragment, fragment.javaClass.simpleName)
          }
      }}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-07-28
        • 2020-08-12
        • 1970-01-01
        • 2015-09-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-01
        相关资源
        最近更新 更多