我正在尝试 android Honeycomb 预览中的新类,但我遇到了一个小问题。我正在制作一个棒球得分应用程序,我希望左侧的按钮(操作菜单)切换右侧的“操作窗格”,我已将其设置为片段。
我希望按钮的 onClickListener() 调用片段事务以将其换出。到目前为止它可以工作,除了当应用程序加载时,它会创建默认片段,但是当我点击一个按钮时,它不是替换默认片段,而是在它旁边创建一个全新的片段。
我已经找了几个小时,我看不出我做错了什么......
请记住,我是 java/android/programming 的新手,所以我可能会遗漏一些非常明显的东西。
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();
}
}
主要的.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;
}
}
}