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;
}
}
}