我在android Honeycomb预览中尝试新类,我遇到了一个小问题。我正在制作棒球得分应用程序,我想要左侧的按钮(操作菜单)切换右侧的“动作窗格”,我将其设置为片段。
我希望按钮'onClickListener()调用Fragment Transaction来交换它。到目前为止,它可以工作,除了当应用程序加载时,它会创建默认片段,但是当我点击一个按钮而不是替换默认片段时,它会在它旁边创建一个全新的片段。
我已经看了几个小时,我看不出我做错了什么......
请记住,我是java / android /编程的新手,所以我可能会遗漏一些非常明显的东西。
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 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>
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;
}
}
}
答案 0 :(得分:2)
您为switch语句设置的默认占位符文本是通过LinearLayout actionPane创建视图。片段从未添加到容器中。当你按下按钮时,调用了swapFragment方法,并在actionPane视图旁边的容器中添加了一个片段。
如果您在默认情况下删除了actionPane的创建,则您没有看到问题。如果要在片段中显示某些默认视图或文本,以便初始启动应用程序以由按钮触发的片段替换,则可以在hc_test onCreate方法中向容器添加片段。当您触发按钮时,这将被换出。我测试了这个并且它有效,可能不是最好的方式,它现在凌晨2点所以请原谅我,如果我写得不清楚!如果您愿意,可以发送或发布代码。
我很好奇你是否找到了一个帮助你用按钮设置片段的教程?我所能找到的只是listFragment示例,并且一直在努力,直到我找到你的帖子。
谢谢,
答案 1 :(得分:2)
我对代码做了一些更改,它按照我的意图运行。对于任何有兴趣的人来说,这是工作版本的相关信息。我没有发布单个片段布局的代码,但它实际上只是我在第一稿中的代码中所做的xml版本。我喜欢onCreateView使用的inflater对象的简单性,它将代码保持在最低限度,并且我可以在不更改代码的情况下更改XML中的布局。
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
}
}
}
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");
}
}
我仍然不完全确定为什么第一次尝试不起作用,但这种方法在我看来有点清洁,它起作用所以我不抱怨。如果您有想法或意见,我仍然很乐意了解这些内容。谢谢!