Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/186.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android替换视图页面中的片段_Android_Android Fragments_Replace_Android Viewpager - Fatal编程技术网

Android替换视图页面中的片段

Android替换视图页面中的片段,android,android-fragments,replace,android-viewpager,Android,Android Fragments,Replace,Android Viewpager,除了用于网页的简单Java脚本之外,我对Android开发和Java还不熟悉。我创建了一个显示三个不同片段的视图寻呼机。对于第二个片段BooksFragment,我使用一个网格视图来显示一个按钮网格,当用户按下按钮时,它应该用另一个视图替换BooksFragment 我遇到的问题是,尽管我正在使用.replace()替换片段,但第二个片段只是显示在原始片段的顶部。现在,我已经广泛地搜索了我的问题,我相信通常发生的原因是原始片段不是动态创建的。作为noob,我似乎是在动态创建片段,但我可能弄错了(

除了用于网页的简单Java脚本之外,我对Android开发和Java还不熟悉。我创建了一个显示三个不同片段的视图寻呼机。对于第二个片段BooksFragment,我使用一个网格视图来显示一个按钮网格,当用户按下按钮时,它应该用另一个视图替换BooksFragment

我遇到的问题是,尽管我正在使用.replace()替换片段,但第二个片段只是显示在原始片段的顶部。现在,我已经广泛地搜索了我的问题,我相信通常发生的原因是原始片段不是动态创建的。作为noob,我似乎是在动态创建片段,但我可能弄错了(我没有在任何XML文件中使用任何标记)。谁能帮帮我吗?我的代码如下:

MainActivity.java

import android.app.ActionBar.Tab;
import android.app.Activity;
import android.app.ActionBar;
import android.support.v4.app.Fragment;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.os.Build;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.ViewPager;
import android.support.v4.app.FragmentManager;

public class MainActivity extends FragmentActivity implements
ActionBar.TabListener {

    // strings for tabs
    private ViewPager viewPager;
    private TabsPagerAdapter mAdapter;
    private ActionBar actionBar;
    // tab titles
    private String[] tabs = {"Status",
                            "Schedule",
                            "Books"};



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        // Initialization
        viewPager = (ViewPager) findViewById(R.id.pager);
        actionBar = getActionBar();
        mAdapter = new TabsPagerAdapter(getSupportFragmentManager());

        viewPager.setAdapter(mAdapter);
        //actionBar.setHomeButtonEnabled(false);
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

        // Adding Tabs
        for (String tab_name : tabs) {
            actionBar.addTab(actionBar.newTab().setText(tab_name).setTabListener(this));
        }

        viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {

            @Override
            public void onPageSelected(int position) {
                // on changing the page
                // make respected tab selected
                actionBar.setSelectedNavigationItem(position);
            }

            @Override
            public void onPageScrolled(int arg0, float arg1, int arg2) {

            }

            @Override
            public void onPageScrollStateChanged(int arg0) {

            }
        });


        if (savedInstanceState == null) {
            getSupportFragmentManager().beginTransaction()
                    .add(R.id.pager, new PlaceholderFragment()).commit();
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    public static class PlaceholderFragment extends Fragment {

        public PlaceholderFragment() {
        }

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

    @Override
    public void onTabSelected(Tab tab, FragmentTransaction ft) {
        // on tab selected
                // show respected fragment view
                viewPager.setCurrentItem(tab.getPosition());

    }

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

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

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;


public class TabsPagerAdapter extends FragmentPagerAdapter{

     public TabsPagerAdapter(FragmentManager fm) {
        super(fm);
     }

     @Override
     public Fragment getItem(int index) {

         switch (index) {
         case 0:
             // First fragment activity
             return new StatusFragment();
         case 1:
             // Second fragment activity
             return new ScheduleFragment();
         case 2:
             // Third fragment activity
             return new BooksFragment();
         }

         return null;
     }

     @Override
     public int getCount() {
         // get item count - equal to number of tabs
         return 3;
     }
}
import java.util.ArrayList;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;


public class MyAdapter extends BaseAdapter {

    private Context context;
    private ArrayList<String> allbooksabbr;

    public MyAdapter(Context context, ArrayList<String> allbooksabbr) {
        this.context = context;
        this.allbooksabbr = allbooksabbr;
    }
    public View getView(int position, View convertView, ViewGroup parent) {

        View gridView;

        if (convertView == null) {
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            gridView = inflater.inflate(R.layout.books_button, null);
        } else {
            gridView = (View) convertView;
        }

        //gridView = new View(context);
        gridView.setBackgroundColor(0xff645C69);
        TextView bookButton = (TextView) gridView.findViewById(R.id.bookbutton);
        bookButton.setText(allbooksabbr.get(position));

        return gridView;
    }

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

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return 0;
    }
}
BooksFragment.java

import java.util.ArrayList;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.GridView;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemSelectedListener;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;


public class BooksFragment extends Fragment implements OnClickListener {

    // get database data
    private static final String DB_NAME = "bookReadingTracker";
    private static final String TABLE_NAME = "book_names";
    private static final String BOOK_NAME_ID = "_id";
    private static final String BOOKNAME = "bookname";
    private static final String BOOKABBR = "bookabbr";

    private SQLiteDatabase database;
    private ArrayList<String> allbooksabbr;

    private OnItemSelectedListener listener;

    GridView gridView;

    public static BooksFragment newInstance() {
        BooksFragment f = new BooksFragment();
        return f;
    }

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

        ExternalDbOpenHelper dbOpenHelper = new ExternalDbOpenHelper(getActivity(), DB_NAME);
        database = dbOpenHelper.openDataBase();

        fillAllbooksabbr();

        View view = inflater.inflate(R.layout.books_fragment, container, false);

        gridView = (GridView) view.findViewById(R.id.gridviewBooks);

        gridView.setAdapter(new MyAdapter(getActivity(), allbooksabbr));

        gridView.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View v,
                    int position, long id) {    


                ///////////////////

                Fragment chapterDetailFragment = ChaptersFragment.newInstance();
                FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
                transaction.addToBackStack(null);
                transaction.replace(R.id.booksFragmentHolder, chapterDetailFragment).commit();

                /////////////////////


            }
        });
        return view;
    }


    private void fillAllbooksabbr() {
        allbooksabbr = new ArrayList<String>();

        Cursor allbooksabbrCursor = database.query(TABLE_NAME, new String[] {BOOK_NAME_ID, BOOKABBR}, 
                                                    null, null, null, null, "CAST (" + BOOK_NAME_ID + " AS INTEGER)");
        allbooksabbrCursor.moveToFirst();
        if(!allbooksabbrCursor.isAfterLast()) {
            do {
                String bookabbr_array = allbooksabbrCursor.getString(1);
                allbooksabbr.add(bookabbr_array);
            } while (allbooksabbrCursor.moveToNext());
        }
        allbooksabbrCursor.close();
    }


    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub

    }
}
import java.util.ArrayList;
导入android.os.Bundle;
导入android.support.v4.app.Fragment;
导入android.support.v4.app.FragmentTransaction;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.view.OnClickListener;
导入android.view.ViewGroup;
导入android.widget.GridView;
导入android.widget.AdapterView;
导入android.widget.AdapterView.OnItemClickListener;
导入android.widget.AdapterView.OnItemSelectedListener;
导入android.database.Cursor;
导入android.database.sqlite.SQLiteDatabase;
公共类BooksFragment扩展了片段实现OnClickListener{
//获取数据库数据
私有静态最终字符串DB_NAME=“bookReadingTracker”;
私有静态最终字符串表\u NAME=“book\u NAME”;
私有静态最终字符串BOOK_NAME_ID=“_ID”;
私有静态最终字符串BOOKNAME=“BOOKNAME”;
私有静态最终字符串BOOKABBR=“BOOKABBR”;
专用数据库;
私人ArrayList allbooksabbr;
私密的被选中的监听器;
GridView;
公共静态实例(){
BooksFragment f=新BooksFragment();
返回f;
}
@凌驾
CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态){
ExternalDbOpenHelper dbOpenHelper=新的ExternalDbOpenHelper(getActivity(),DB_NAME);
database=dbOpenHelper.openDataBase();
fillAllbooksabbr();
视图=充气机。充气(R.layout.books\u碎片,容器,假);
gridView=(gridView)view.findViewById(R.id.gridviewBooks);
setAdapter(新的MyAdapter(getActivity(),allbooksabbr));
setOnItemClickListener(新的OnItemClickListener(){
public void onItemClick(AdapterView父视图、视图v、,
int位置,长id){
///////////////////
Fragment chapterDetailFragment=ChaptersFragment.newInstance();
FragmentTransaction=getChildFragmentManager().beginTransaction();
transaction.addToBackStack(空);
transaction.replace(R.id.booksFragmentHolder,chapterDetailFragment.commit();
/////////////////////
}
});
返回视图;
}
私有void fillbooksabbr(){
allbooksabbr=newArrayList();
Cursor allbooksabbrCursor=database.query(TABLE_NAME,new String[]{BOOK_NAME_ID,booksabbr},
null,null,null,null,“强制转换(“+BOOK\u NAME\u ID+”作为整数)”;
allbooksabbr.moveToFirst();
如果(!allbooksabrcursor.isAfterLast()){
做{
String bookabbr\u数组=allbookabbrcursor.getString(1);
allbooksabbr.add(booksabbr\u数组);
}while(allbooksabbrursor.moveToNext());
}
allbooksabbr.close();
}
@凌驾
公共void onClick(视图v){
//TODO自动生成的方法存根
}
}
MyAdapter.java

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;


public class TabsPagerAdapter extends FragmentPagerAdapter{

     public TabsPagerAdapter(FragmentManager fm) {
        super(fm);
     }

     @Override
     public Fragment getItem(int index) {

         switch (index) {
         case 0:
             // First fragment activity
             return new StatusFragment();
         case 1:
             // Second fragment activity
             return new ScheduleFragment();
         case 2:
             // Third fragment activity
             return new BooksFragment();
         }

         return null;
     }

     @Override
     public int getCount() {
         // get item count - equal to number of tabs
         return 3;
     }
}
import java.util.ArrayList;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;


public class MyAdapter extends BaseAdapter {

    private Context context;
    private ArrayList<String> allbooksabbr;

    public MyAdapter(Context context, ArrayList<String> allbooksabbr) {
        this.context = context;
        this.allbooksabbr = allbooksabbr;
    }
    public View getView(int position, View convertView, ViewGroup parent) {

        View gridView;

        if (convertView == null) {
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            gridView = inflater.inflate(R.layout.books_button, null);
        } else {
            gridView = (View) convertView;
        }

        //gridView = new View(context);
        gridView.setBackgroundColor(0xff645C69);
        TextView bookButton = (TextView) gridView.findViewById(R.id.bookbutton);
        bookButton.setText(allbooksabbr.get(position));

        return gridView;
    }

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

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return 0;
    }
}
import java.util.ArrayList;
导入android.content.Context;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.BaseAdapter;
导入android.widget.TextView;
公共类MyAdapter扩展了BaseAdapter{
私人语境;
私人ArrayList allbooksabbr;
公共MyAdapter(上下文上下文,ArrayList allbooksabbr){
this.context=上下文;
this.allbooksabbr=allbooksabbr;
}
公共视图getView(int位置、视图转换视图、视图组父视图){
视图网格视图;
if(convertView==null){
LayoutFlater充气器=(LayoutFlater)context.getSystemService(context.LAYOUT\u充气器\u服务);
gridView=充气机。充气(R.layout.books\u按钮,空);
}否则{
gridView=(视图)convertView;
}
//gridView=新视图(上下文);
gridView.setBackgroundColor(0xff645C69);
TextView bookButton=(TextView)gridView.findViewById(R.id.bookButton);
bookButton.setText(allbooksabr.get(position));
返回gridView;
}
@凌驾
public int getCount(){
//TODO自动生成的方法存根
返回allbooksabbr.size();
}
@凌驾
公共对象getItem(int位置){
//TODO自动生成的方法存根
返回null;
}
@凌驾
公共长getItemId(int位置){
//TODO自动生成的方法存根
返回0;
}
}
以下是我的XML文件:

fragment_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.gclapps.bookreadingscheduletracker.MainActivity$PlaceholderFragment" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />

</RelativeLayout>

books\u fragment.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/booksFragmentHolder"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="10dp" >

    <TextView
        android:id="@+id/textViewBooks"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Books" 
        android:textAppearance="?android:attr/textAppearanceSmall"
        android:textColor="#666666"
        android:paddingTop="10dp"
        android:paddingBottom="5dp" />

     <GridView
         android:id="@+id/gridviewBooks"
         android:layout_width="fill_parent"
         android:layout_height="fill_parent"
         android:columnWidth="60dp"
         android:gravity="center"
         android:numColumns="auto_fit"
         android:stretchMode="columnWidth"
         android:verticalSpacing="2dp"
         android:horizontalSpacing="2dp" >
     </GridView>
</FrameLayout>

请帮助我找到我的BooksFragment视图没有被ChaptersFragment视图替换的原因。如果BooksFragment视图确实不是动态创建的,请帮助我这样做。我已经阅读了关于如何做的文档,但不知道如何做