Android片段复制

时间:2011-02-19 23:07:17

标签: android android-fragments android-3.0-honeycomb

我在android Honeycomb预览中尝试新类,我遇到了一个小问题。我正在制作棒球得分应用程序,我想要左侧的按钮(操作菜单)切换右侧的“动作窗格”,我将其设置为片段。

我希望按钮'onClickListener()调用Fragment Transaction来交换它。到目前为止,它可以工作,除了当应用程序加载时,它会创建默认片段,但是当我点击一个按钮而不是替换默认片段时,它会在它旁边创建一个全新的片段。

我已经看了几个小时,我看不出我做错了什么......

请记住,我是java / android /编程的新手,所以我可能会遗漏一些非常明显的东西。

hc_test.java(主要活动)

package com.pte.hc_test;

import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class hc_test extends Activity {
    /** Called when the activity is first created. */

    /* declare class-level variables */
//  private LinearLayout touchPad;
//  private TextView touchCoordText;

    private Button pitchButton;
    private Button hitButton;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        pitchButton = (Button)findViewById(R.id.actionButton1);
        hitButton = (Button)findViewById(R.id.actionButton2);

        pitchButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                swapFragment(actionType.PITCH_ACTION);
            }
        });

        hitButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                swapFragment(actionType.HIT_ACTION);
            }
        });
    }

    private void swapFragment(int myType){

        Fragment f = new actionFragment(myType);

        // Execute a transaction, replacing any existing
        // fragment with this one inside the frame.
        FragmentTransaction ft = getFragmentManager().beginTransaction();
        ft.replace(R.id.actionFragment, f);
        ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
        ft.addToBackStack(null);
        ft.commit();

    }
}

main.xml中

<?xml version="1.0" encoding="utf-8"?>

<!-- this is the parent layout of the whole screen -->
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#2F2F4F"
    >

    <!-- SCOREBOARD MASTER LAYOUT -->
    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        >

        <!-- team name placeholders -->
        <LinearLayout
            android:orientation="vertical"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="0"
            android:padding="5dp"
            >
            <TextView style="@style/inningLabel"
                android:text="TEAM"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <TextView style="@style/inningValue"
                android:text="@string/visitor"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <TextView style="@style/inningValue"
                android:text="@string/home"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
        </LinearLayout>
        <!-- end team names -->

        <!-- Inning table -->
        <HorizontalScrollView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:fadingEdge="vertical">

            <TableLayout
                android:id = "@+id/innings"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:padding="5dp"
                >
                <!-- inning label row -->

                <!-- get these done with code?? -->
                <TableRow android:layout_height="wrap_content">
                    <TextView style="@style/inningLabel"
                        android:id="@+id/inn1_label"
                        android:text="1"
                        android:layout_height="wrap_content"
                        />
                    <TextView style="@style/inningLabel"
                        android:id="@+id/inn2_label"
                        android:text="2"
                        android:layout_height="wrap_content"
                        />
                    <TextView style="@style/inningLabel"
                        android:id="@+id/inn3_label"
                        android:text="3"
                        android:layout_height="wrap_content"
                        />
                    <TextView style="@style/inningLabel"
                        android:id="@+id/inn4_label"
                        android:text="4"
                        android:layout_height="wrap_content"
                        />
                    <TextView style="@style/inningLabel"
                        android:id="@+id/inn5_label"
                        android:text="5"
                        android:layout_height="wrap_content"
                        />
                    <TextView style="@style/inningLabel"
                        android:id="@+id/inn6_label"
                        android:text="6"
                        android:layout_height="wrap_content"
                        />
                    <TextView style="@style/inningLabel"
                        android:id="@+id/inn7_label"
                        android:text="7"
                        android:layout_height="wrap_content"
                        />
                    <TextView style="@style/inningLabel"
                        android:id="@+id/inn8_label"
                        android:text="8"
                        android:layout_height="wrap_content"
                        />
                    <TextView style="@style/inningLabel"
                        android:id="@+id/inn9_label"
                        android:text="9"
                        android:layout_height="wrap_content"
                        />
                </TableRow>
                <!-- end inning labels -->

                <!-- top inning row -->
                <TableRow android:layout_height="wrap_content">
                    <TextView style="@style/inningValue"
                        android:id="@+id/top1_label"
                        android:text="0"
                        android:layout_height="wrap_content"
                        />
                    <TextView style="@style/inningValue"
                        android:id="@+id/top2_label"
                        android:text="0"
                        android:layout_height="wrap_content"
                        />
                    <TextView style="@style/inningValue"
                        android:id="@+id/top3_label"
                        android:text="0"
                        android:layout_height="wrap_content"
                        />
                    <TextView style="@style/inningValue"
                        android:id="@+id/top4_label"
                        android:text="0"
                        android:layout_height="wrap_content"
                        />
                    <TextView style="@style/inningValue"
                        android:id="@+id/top5_label"
                        android:text="0"
                        android:layout_height="wrap_content"
                        />
                    <TextView style="@style/inningValue"
                        android:id="@+id/top6_label"
                        android:text="0"
                        android:layout_height="wrap_content"
                        />
                    <TextView style="@style/inningValue"
                        android:id="@+id/top7_label"
                        android:text="0"
                        android:layout_height="wrap_content"
                        />
                    <TextView style="@style/inningValue"
                        android:id="@+id/top8_label"
                        android:text="0"
                        android:layout_height="wrap_content"
                        />
                    <TextView style="@style/inningValue"
                        android:id="@+id/top9_label"
                        android:text="0"
                        android:layout_height="wrap_content"
                        />
                </TableRow>
                <!-- end top inning row -->

                <!-- bottom inning row -->
                <TableRow android:layout_height="wrap_content">
                    <TextView style="@style/inningValue"
                        android:id="@+id/bot1_label"
                        android:text="0"
                        android:layout_height="wrap_content"
                        />
                    <TextView style="@style/inningValue"
                        android:id="@+id/bot2_label"
                        android:text="0"
                        android:layout_height="wrap_content"
                        />
                    <TextView style="@style/inningValue"
                        android:id="@+id/bot3_label"
                        android:text="0"
                        android:layout_height="wrap_content"
                        />
                    <TextView style="@style/inningValue"
                        android:id="@+id/bot4_label"
                        android:text="0"
                        android:layout_height="wrap_content"
                        />
                    <TextView style="@style/inningValue"
                        android:id="@+id/bot5_label"
                        android:text="0"
                        android:layout_height="wrap_content"
                        />
                    <TextView style="@style/inningValue"
                        android:id="@+id/bot6_label"
                        android:text="0"
                        android:layout_height="wrap_content"
                        />
                    <TextView style="@style/inningValue"
                        android:id="@+id/bot7_label"
                        android:text="0"
                        android:layout_height="wrap_content"
                        />
                    <TextView style="@style/inningValue"
                        android:id="@+id/bot8_label"
                        android:text="0"
                        android:layout_height="wrap_content"
                        />
                    <TextView style="@style/inningValue"
                        android:id="@+id/bot9_label"
                        android:text="0"
                        android:layout_height="wrap_content"
                        />
                </TableRow>
                <!-- end bottom inning row -->

            </TableLayout>
        </HorizontalScrollView>
        <!-- end inning table -->

        <!-- Runs, Hits, Errors Count -->
        <TableLayout
            android:id = "@+id/RHE"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="0"
            android:padding="5dp">

            <TableRow android:layout_height="wrap_content">
                <TextView style="@style/inningLabel"
                    android:id="@+id/runLabel"
                    android:text="R"
                    android:layout_height="wrap_content"
                    />
                <TextView style="@style/inningLabel"
                    android:id="@+id/hitLabel"
                    android:text="H"
                    android:layout_height="wrap_content"
                    />
                <TextView style="@style/inningLabel"
                    android:id="@+id/errorLabel"
                    android:text="E"
                    android:layout_height="wrap_content"
                    />
            </TableRow>

            <TableRow android:layout_height="wrap_content">
                <TextView style="@style/inningValue"
                    android:id="@+id/visitorRuns"
                    android:text="0"
                    android:layout_height="wrap_content"
                    />
                <TextView style="@style/inningValue"
                    android:id="@+id/visitorHits"
                    android:text="0"
                    android:layout_height="wrap_content"
                    />
                <TextView style="@style/inningValue"
                    android:id="@+id/visitorErrors"
                    android:text="0"
                    android:layout_height="wrap_content"
                    />
            </TableRow>

            <TableRow android:layout_height="wrap_content">
                <TextView style="@style/inningValue"
                    android:id="@+id/homeRuns"
                    android:text="0"
                    android:layout_height="wrap_content"
                    />
                <TextView style="@style/inningValue"
                    android:id="@+id/homeHits"
                    android:text="0"
                    android:layout_height="wrap_content"
                    />
                <TextView style="@style/inningValue"
                    android:id="@+id/homeErrors"
                    android:text="0"
                    android:layout_height="wrap_content"
                    />
            </TableRow>

        </TableLayout>

    </LinearLayout>
    <!-- END OF SCOREBOARD LAYOUT -->

    <!-- MAIN ACTIVITY SECTION -->
    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content">

        <!-- ACTION MENU BEGIN -->
        <LinearLayout
            android:orientation="vertical"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1">

            <Button
                android:id="@+id/actionButton1"
                android:text="ActionButton1"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                />
            <Button
                android:id="@+id/actionButton2"
                android:text="ActionButton2"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                />
            <Button
                android:id="@+id/actionButton3"
                android:text="ActionButton3"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                />
            <Button
                android:id="@+id/actionButton4"
                android:text="ActionButton4"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                />
            <Button
                android:id="@+id/actionButton5"
                android:text="ActionButton5"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                />

        </LinearLayout>
        <!-- ACTION MENU END -->

        <!-- ACTION FRAME BEGIN -->

        <fragment class="com.pte.hc_test.actionFragment"
            android:id="@+id/actionFragment"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1" />

        <!-- ACTION FRAME END -->

    </LinearLayout>
    <!-- MAIN ACTIVITY SECTION END -->

    <!-- LIVE STATS FRAME BEGIN -->
    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content">

        <!-- left live stat pane -->
        <LinearLayout
            android:id="@+id/left_stat_pane"
            android:orientation="vertical"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            >

            <TextView style="@style/statHeader"
                android:id="@+id/left_playerName"
                android:text="{PITCHER NAME}"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />

            <TextView style="@style/statText"
                android:id="@+id/left_stat1"
                android:text="Stat1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <TextView style="@style/statText"
                android:id="@+id/left_stat2"
                android:text="Stat2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <TextView style="@style/statText"
                android:id="@+id/left_stat3"
                android:text="Stat3"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
        </LinearLayout>
        <!-- end left live stat pane -->

        <!-- right live stat pane -->
        <LinearLayout
            android:id="@+id/right_stat_pane"
            android:orientation="vertical"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            >

            <TextView style="@style/statHeader"
                android:id="@+id/right_playerName"
                android:text="{BATTER NAME}"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />

            <TextView style="@style/statText"
                android:id="@+id/right_stat1"
                android:text="Stat1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <TextView style="@style/statText"
                android:id="@+id/right_stat2"
                android:text="Stat2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
            <TextView style="@style/statText"
                android:id="@+id/right_stat3"
                android:text="Stat3"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />

        </LinearLayout>
        <!-- end right live stat pane -->

    </LinearLayout>

</LinearLayout>

actionFragment.java

package com.pte.hc_test;

import android.app.Fragment;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;

public class actionFragment extends Fragment {

    // class variables
    int mActivityType;

    // default (null) constructor
    public actionFragment(){
        Log.v("PTE", "null constructor");       
    }

    public actionFragment(int n){
        mActivityType = n;
        Log.v("PTE", "explicit constructor (" + n + ")");
    }

    @Override
    public void onCreate(Bundle saved){
        super.onCreate(saved);
        if (saved != null){
            mActivityType = saved.getInt("Type");
        }
        Log.v("PTE", "FIRE: actionFragment.onCreate()");
    }

    @Override
    public void onSaveInstanceState(Bundle toSave){
        toSave.putInt("Type", mActivityType);
        Log.v("PTE", "FIRE: actionFragment.onSaveInstanceState()");
    }

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

        Log.v("PTE", "FIRE: actionFragment.onCreateView()");
        Log.v("PTE", "with mActivityType == " + mActivityType);
        try {
            Log.v("PTE", "with onCreateView()'s container = " + container.toString());
        } catch (Exception e) {
            Log.v("PTE", "could not convert container to string. Must be null");
            Log.v("PTE", e.toString());
        }

        Context c = getActivity().getApplicationContext();
        LinearLayout actionPane = new LinearLayout(c);

        switch (mActivityType) {
            case actionType.PITCH_ACTION:
                Log.v("PTE", "FIRE: actionFragment.pitchPane()");

                // instantiate all the required views
                 // parent container
                TextView topLabel = new TextView(c);
                TableLayout strikeZone = new TableLayout(c);
                ImageView image = new ImageView(c);

                // set properties for each view
                actionPane.setOrientation(LinearLayout.VERTICAL);

                topLabel.setText("top Label Text");

                // create the strike zone table
                for(int i=1; i<6; i++){
                    TableRow tr = new TableRow(c);

                    for(int j=1; j<6; j++){
                        TextView tv = new TextView(c);
                        tv.setText("C" + j + ":R" + i);
                        tv.setPadding(3, 3, 3, 3);
                        tr.addView(tv);
                    } 
                    strikeZone.addView(tr);
                }

                image.setPadding(0, 60, 0, 30);
                image.setImageResource(R.drawable.homeplate);

                // add child views to parent
                actionPane.addView(topLabel);
                actionPane.addView(strikeZone);
                actionPane.addView(image);

                return actionPane;

            case actionType.HIT_ACTION:
                Log.v("PTE", "FIRE: actionFragment.hitPane()");

                // simple layout with a text view for testing
                TextView placeholder = new TextView(c);
                placeholder.setText("This is a placeholder");

                actionPane.addView(placeholder);
                return actionPane;

            default:
                Log.v("PTE", "FIRE: actionFragment.defaultPane()");                 

                            // If I comment this TextView out, I achieve my intended behavior
                TextView label = new TextView(c);
                label.setText("This is the default pane");
                actionPane.addView(label);

                return actionPane;
        }
    }

}

2 个答案:

答案 0 :(得分:2)

您为switch语句设置的默认占位符文本是通过LinearLayout actionPane创建视图。片段从未添加到容器中。当你按下按钮时,调用了swapFragment方法,并在actionPane视图旁边的容器中添加了一个片段。

如果您在默认情况下删除了actionPane的创建,则您没有看到问题。如果要在片段中显示某些默认视图或文本,以便初始启动应用程序以由按钮触发的片段替换,则可以在hc_test onCreate方法中向容器添加片段。当您触发按钮时,这将被换出。我测试了这个并且它有效,可能不是最好的方式,它现在凌晨2点所以请原谅我,如果我写得不清楚!如果您愿意,可以发送或发布代码。

我很好奇你是否找到了一个帮助你用按钮设置片段的教程?我所能找到的只是listFragment示例,并且一直在努力,直到我找到你的帖子。

谢谢,

答案 1 :(得分:2)

我对代码做了一些更改,它按照我的意图运行。对于任何有兴趣的人来说,这是工作版本的相关信息。我没有发布单个片段布局的代码,但它实际上只是我在第一稿中的代码中所做的xml版本。我喜欢onCreateView使用的inflater对象的简单性,它将代码保持在最低限度,并且我可以在不更改代码的情况下更改XML中的布局。

actionFragment.java

package com.pte.StatCast;

// imports


public class actionFragment extends Fragment {

    // class variables
    int mActivityType;

    // default (null) constructor
    public actionFragment(){

    }

    public actionFragment(int n){
        this.mActivityType = n;
    }

    @Override
    public void onCreate(Bundle saved){
        super.onCreate(saved);
        if (saved != null){
            mActivityType = saved.getInt("Type");
        }
    }

    @Override
    public void onSaveInstanceState(Bundle toSave){
        toSave.putInt("Type", mActivityType);
    }

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

        Context c = getActivity().getApplicationContext();
        LinearLayout.LayoutParams p = 
            new LinearLayout.LayoutParams(
                    LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT, 1);
        View actionPane = new View(c);

        switch (mActivityType) {
            case actionType.PITCH_ACTION:

                // inflate XML resource to create pitch_frag view
                actionPane = inflater.inflate(R.layout.pitch_frag, null);
                actionPane.setLayoutParams(p);

                // set up listener for touch events
                ImageView strikeZoneImg = (ImageView)actionPane.findViewById(R.id.strikeZone);
                strikeZoneImg.setOnTouchListener(new OnTouchListener(){

                    @Override
                    public boolean onTouch(View v, MotionEvent e) {

                        //DO STUFF
                });

                return actionPane;

            case actionType.HIT_ACTION:

                // inflate XML resource to create hit_frag view
                actionPane = inflater.inflate(R.layout.hit_frag, null);
                actionPane.setLayoutParams(p);
                return actionPane;

            default:
                LinearLayout l = new LinearLayout(c);
                l.setLayoutParams(p);

                return l; // return a blank linear layout as the default action
        }
    }

}

StatCast.java

package com.pte.StatCast;

// imports

public class StatCast extends Activity {
/** Called when the activity is first created. */

    // Declare stuff

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // database stuff here

        /*
         * Swap in the pitch fragment when activity first loads
         */
        swapFragment(actionType.PITCH_ACTION);
    }

    private void swapFragment(int myType){

        Fragment f = new actionFragment(myType);

        // Execute a transaction, replacing any existing
        // fragment with this one inside the frame.
        FragmentTransaction ft = getFragmentManager().beginTransaction();
        ft.replace(R.id.actionFragment, f);
        ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
        ft.addToBackStack(null);
        ft.commit();

        Log.v("PTE", "COMPLETED: swapFragment");
    }
}

我仍然不完全确定为什么第一次尝试不起作用,但这种方法在我看来有点清洁,它起作用所以我不抱怨。如果您有想法或意见,我仍然很乐意了解这些内容。谢谢!