【问题标题】:change a fragment by pressing ImageView Button按 ImageView 按钮更改片段
【发布时间】:2014-02-05 08:50:45
【问题描述】:

我有四个片段(在两个包中)及其对应的四个 xml 文件。我已经根据tabselect设置了其中的三个。一个片段 (ComapreFrag.java) 有一个ImagineView button。当我按下它时,我想显示一个新片段 (CreditCards.java)。我怎样才能做到这一点?在下面找到我使用的代码。

MainActivity.java

 import android.support.v4.app.Fragment;

package com.example.swipetabs;

import com.tabs.*;

import android.os.Bundle;
import android.app.ActionBar;
import android.app.ActionBar.Tab;
import android.app.ActionBar.TabListener;
import android.app.Activity;
import android.app.FragmentTransaction;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.Menu;
import android.widget.ImageView;
import com.comparenow.*;
import android.support.v4.app.FragmentManager;

public class MainActivity extends FragmentActivity implements TabListener {

    ActionBar action_bar;
    ViewPager viewPager;
    ImageView creditCards;
    
    CreditCards credit_cards;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //
        credit_cards =new CreditCards();
        
        Bundle args=new Bundle();
        
        viewPager=(ViewPager)findViewById(R.id.pager);
        //intialise fragement
        
    
        viewPager.setAdapter(new MyAdoptor(getSupportFragmentManager()));
        viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            
            @Override
            public void onPageSelected(int arg0) {
                // TODO Auto-generated method stub
                action_bar.setSelectedNavigationItem(arg0);
                
            }
            
            @Override
            public void onPageScrolled(int arg0, float arg1, int arg2) {
                // TODO Auto-generated method stub
                
            }
            
            @Override
            public void onPageScrollStateChanged(int arg0) {
                // TODO Auto-generated method stub
                
            }
        });
        
        action_bar=getActionBar();
        //action_bar.setBackgroundDrawable(d)
        action_bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
        
        ActionBar.Tab tab1=action_bar.newTab();
        tab1.setText("Login");
        
        tab1.setTabListener(this);
        
        ActionBar.Tab tab2=action_bar.newTab();
        tab2.setText("Compare Now");
        tab2.setTabListener(this);
        
        ActionBar.Tab tab3=action_bar.newTab();
        tab3.setText("Search");
        tab3.setTabListener(this);
        
        action_bar.addTab(tab1);
        action_bar.addTab(tab2);
        action_bar.addTab(tab3);
        
        CreditCards cards=new CreditCards();
        
        cards.setArguments(args);
        
        
    }
    
    public void switchToFragmentB(){
           FragmentTransaction fm=getSupportFragmentManager().beginTransaction();     
           fm.replace(R.id.tabcontent, new Myprofile());        
           fm.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
           fm.addToBackStack(null);
           fm.commit();
        
        
     }

    @Override
    public void onTabReselected(Tab arg0, FragmentTransaction arg1) {
        // TODO Auto-generated method stub
        
    }

    @Override
    public void onTabSelected(Tab tab, FragmentTransaction ft) {
        // TODO Auto-generated method stub
        viewPager.setCurrentItem(tab.getPosition());
        
    }

    @Override
    public void onTabUnselected(Tab tab, FragmentTransaction ft) {
        // TODO Auto-generated method stub
        
        
    }

    
}


class MyAdoptor extends FragmentPagerAdapter
{

    public MyAdoptor(FragmentManager fm) {
        super(fm);
                // TODO Auto-generated constructor stub
    }

    @Override
    public Fragment getItem(int arg0) {
        // TODO Auto-generated method stub
        
        Fragment fragement=null;
        if(arg0==0)
        {
            fragement=new Loginfrag();
        }
        if(arg0==1)
        {
            fragement=new Comparefrag();
        }
        if(arg0==2)
        {
            fragement=new Searchfrag();
        }
        
        
        
        System.out.print("<><><><>");
        return fragement;
    
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return 3;
    }
    
}

Comparefrag.java(这里是fragment,我用imageView调用了一个新的fragment-我有新的fragment并且它是在MainActivity.java中启动的)

       package com.tabs;

import com.comparenow.CreditCards;
import com.example.swipetabs.MainActivity;
import com.example.swipetabs.R;
import com.example.swipetabs.R.layout;

import android.support.v4.app.FragmentTransaction;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;



/**
 * A simple {@link android.support.v4.app.Fragment} subclass.
 * 
 */
public class Comparefrag extends Fragment implements View.OnClickListener {

    public Comparefrag() {
        // Required empty public constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View v = inflater.inflate(R.layout.comparenow_b, container, false);
        ImageView btnT = (ImageView)v.findViewById(R.id.imageView2);
        btnT.setOnClickListener(this);
        return v;
    }
    
public void onClick(View v) {
    
    // FragmentTransaction fm=((MainActivity)getActivity()).getSupportFragmentManager().beginTransaction();
     FragmentTransaction fm=getActivity().getSupportFragmentManager().beginTransaction();
     CreditCards aFrag = new CreditCards(); 
     fm.replace(android.R.id.tabcontent, aFrag);
     fm.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
     fm.commit();
        
        System.out.print(">>>>>>>>>>>>");
         
         /*When I click this button in my fragment, I'd like it to go to fragment B for example*/
    //  ((MainActivity)getActivity()).switchToFragmentB();
           
        
    }

}

CreditCards.java

package com.comparenow;

import com.example.swipetabs.R;
import com.example.swipetabs.R.layout;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

/**
 * A simple {@link android.support.v4.app.Fragment} subclass.
 * 
 */
public class CreditCards extends Fragment {

    public CreditCards() {
        // Required empty public constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        
        return inflater.inflate(R.layout.creditcards_c, container, false);
        
        
    }

}
   

错误:日志猫

02-05 17:10:59.163: E/AndroidRuntime(30400): FATAL EXCEPTION: main
02-05 17:10:59.163: E/AndroidRuntime(30400): java.lang.IllegalArgumentException: No view found for id 0x1020011 (android:id/tabcontent) for fragment CreditCards{418f6838 #3 id=0x1020011}
02-05 17:10:59.163: E/AndroidRuntime(30400):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:919)
02-05 17:10:59.163: E/AndroidRuntime(30400):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104)
02-05 17:10:59.163: E/AndroidRuntime(30400):    at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
02-05 17:10:59.163: E/AndroidRuntime(30400):    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1467)
02-05 17:10:59.163: E/AndroidRuntime(30400):    at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:440)
02-05 17:10:59.163: E/AndroidRuntime(30400):    at android.os.Handler.handleCallback(Handler.java:605)
02-05 17:10:59.163: E/AndroidRuntime(30400):    at android.os.Handler.dispatchMessage(Handler.java:92)
02-05 17:10:59.163: E/AndroidRuntime(30400):    at android.os.Looper.loop(Looper.java:137)
02-05 17:10:59.163: E/AndroidRuntime(30400):    at android.app.ActivityThread.main(ActivityThread.java:4511)
02-05 17:10:59.163: E/AndroidRuntime(30400):    at java.lang.reflect.Method.invokeNative(Native Method)
02-05 17:10:59.163: E/AndroidRuntime(30400):    at java.lang.reflect.Method.invoke(Method.java:511)
02-05 17:10:59.163: E/AndroidRuntime(30400):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:980)
02-05 17:10:59.163: E/AndroidRuntime(30400):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:747)
02-05 17:10:59.163: E/AndroidRuntime(30400):    at dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

  • 使用这个 FragmentTransaction fm=getActivity().getSupportFragmentManager().beginTransaction();
  • @Palak 我试过这种方式 FragmentTransaction fm=((MainActivity)getActivity()).getSupportFragmentManager().beginTransaction();但我收到错误,因为类型不匹配:无法从 android.support.v4.app.FragmentTransaction 转换为 android.app.FragmentTransaction
  • import android.app.FragmentTransaction;n 将其替换为 import android.support.v4.app.FragmentTransaction;
  • @Palak 是的,它起作用了方法 getSupportFragmentManager() 对于它无法启动的类型 Comparefrag 未定义。你能告诉我任何想法吗?请
  • 只写getActivity()).getSupportFragmentManager().beginTransaction();删除类型转换

标签: android android-fragments fragment


【解决方案1】:

在点击事件中试试这个

   FragmentTransaction fm=getSupportFragmentManager().beginTransaction();     
   fm.replace(R.id.tabcontent, new Myprofile());        
   fm.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
   fm.addToBackStack(null);
   fm.commit();

【讨论】:

  • @David 当我将此代码添加到 onClick(View v) 时,我遇到了很多错误。
  • 你能列出一些错误信息吗?顺便说一句:你应该@VenushkaT,我只是格式化了代码。
  • @David ype 不匹配:无法从 android.support.v4.app.FragmentTransaction 转换为 android.app.FragmentTransaction
  • @VenushkaT 你可能会导入错误的包,不确定,祝你好运。
  • @David 我把这段代码放在 public void switchToFragmentB() MainActivity.java 下
【解决方案2】:

查看我的演示代码


package com.tabs;

import com.comparenow.CreditCards;
import com.example.swipetabs.MainActivity;
import com.example.swipetabs.R;
import com.example.swipetabs.R.layout;

import android.support.v4.app.FragmentTransaction;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;



/**
 * A simple {@link android.support.v4.app.Fragment} subclass.
 * 
 */
public class Comparefrag extends Fragment implements View.OnClickListener {

    public Comparefrag() {
        // Required empty public constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View v = inflater.inflate(R.layout.comparenow_b, container, false);
        ImageView btnT = (ImageView)v.findViewById(R.id.imageView2);
        btnT.setOnClickListener(this);
        return v;
    }

public void onClick(View v) {

    // FragmentTransaction fm=((MainActivity)getActivity()).getSupportFragmentManager().beginTransaction();
     FragmentTransaction fm=getActivity().getSupportFragmentManager().beginTransaction();
     CreditCards aFrag = new CreditCards(); 
     fm.replace(android.R.id.tabcontent, aFrag);
     fm.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
     fm.commit();

        System.out.print(">>>>>>>>>>>>");

         /*When I click this button in my fragment, I'd like it to go to fragment B for example*/
    //  ((MainActivity)getActivity()).switchToFragmentB();


    }

}

【讨论】:

  • 请在那里找到我的新编辑代码我得到新的错误无法初始化 FragmentTransaction 的 getSupportFragmentManager() fm=getSupportFragmentManager().beginTransaction(); (Comparefrag.java)
猜你喜欢
  • 1970-01-01
  • 2018-02-18
  • 2020-01-23
  • 2016-04-30
  • 1970-01-01
  • 2018-05-28
  • 2013-05-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多