【问题标题】:Android Bar Activity with Fragments带有片段的 Android Bar Activity
【发布时间】:2014-07-10 07:20:32
【问题描述】:

我对包含 Fragments 的 Android Bar Activity 的结构有疑问。我有一个 MainMenuActivity 集成栏元素,创建片段等。 我想启用一个按钮来做某事(在片段内)。 我想在片段中启动一个计时器,但应用程序在打开片段之前崩溃。

这是我得到的错误:

07-10 09:14:08.010: E/AndroidRuntime(8615):     at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1447)
07-10 09:14:08.010: E/AndroidRuntime(8615):     at android.app.FragmentManagerImpl$1.run(FragmentManager.java:443)
07-10 09:14:08.010: E/AndroidRuntime(8615):     at android.os.Handler.handleCallback(Handler.java:733)
07-10 09:14:08.010: E/AndroidRuntime(8615):     at android.os.Handler.dispatchMessage(Handler.java:95)
07-10 09:14:08.010: E/AndroidRuntime(8615):     at android.os.Looper.loop(Looper.java:157)
07-10 09:14:08.010: E/AndroidRuntime(8615):     at android.app.ActivityThread.main(ActivityThread.java:5356)
07-10 09:14:08.010: E/AndroidRuntime(8615):     at java.lang.reflect.Method.invokeNative(Native Method)
07-10 09:14:08.010: E/AndroidRuntime(8615):     at java.lang.reflect.Method.invoke(Method.java:515)
07-10 09:14:08.010: E/AndroidRuntime(8615):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
07-10 09:14:08.010: E/AndroidRuntime(8615):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
07-10 09:14:08.010: E/AndroidRuntime(8615):     at dalvik.system.NativeStart.main(Native Method)

然后这里是 MainMenuActivity.java 文件:

package com.example.client;

import org.slf4j.LoggerFactory;
import android.annotation.SuppressLint;
import android.app.ActionBar;
import android.app.ActionBar.Tab;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Fragment;
import android.app.FragmentTransaction;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.location.Location;
import android.os.Bundle;
import android.os.IBinder;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView; 
import android.widget.Toast;
import com.example.uadclient.R;



public class MainMenuActivity extends Activity  {

Logger LOG = LoggerFactory.getLogger(MainMenuActivity.class);

private static final String TAB_KEY_INDEX = "tab_key";

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    // ActionBar
    ActionBar actionbar = getActionBar();
     actionbar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

    // create new tabs and and set up the titles of the tabs
    ActionBar.Tab mFindTab = actionbar.newTab().setText(
            getString(R.string.ui_tabname_find));
    ActionBar.Tab mChatTab = actionbar.newTab().setText(
            getString(R.string.ui_tabname_chat));
    ActionBar.Tab mMeetTab = actionbar.newTab().setText(
            getString(R.string.ui_tabname_meet));
    ActionBar.Tab mPartyTab = actionbar.newTab().setText(
            getString(R.string.ui_tabname_party));

     // create the fragments
    Fragment mFindFragment = new FindFragment();
    Fragment mChatFragment = new ChatFragment();
    Fragment mMeetFragment = new MeetFragment();
    Fragment mPartyFragment = new PartyFragment();

     // bind the fragments to the tabs - set up tabListeners for each tab
    mFindTab.setTabListener(new MyTabsListener(mFindFragment,
            getApplicationContext()));
    mChatTab.setTabListener(new MyTabsListener(mChatFragment,
            getApplicationContext()));
    mMeetTab.setTabListener(new MyTabsListener(mMeetFragment,
            getApplicationContext()));
    mPartyTab.setTabListener(new MyTabsListener(mPartyFragment,
            getApplicationContext()));

     // add the tabs to the action bar
    actionbar.addTab(mFindTab);
    actionbar.addTab(mChatTab);
    actionbar.addTab(mMeetTab);
    actionbar.addTab(mPartyTab);


    // restore to navigation
    if (savedInstanceState != null) {
        Toast.makeText(getApplicationContext(),
                "tab is " + savedInstanceState.getInt(TAB_KEY_INDEX, 0),
                Toast.LENGTH_SHORT).show();

        actionbar.setSelectedNavigationItem(savedInstanceState.getInt(
                TAB_KEY_INDEX, 0));
    }

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.main, menu);
    return true;
}


protected void onDestroy(){
    super.onDestroy();

}



@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {

    }
    return false;
}

// onSaveInstanceState() is used to "remember" the current state when a
// configuration change occurs such screen orientation change. This
// is not meant for "long term persistence". We store the tab navigation

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    Toast.makeText(
            this,
            "onSaveInstanceState: tab is"
                    + getActionBar().getSelectedNavigationIndex(),
            Toast.LENGTH_SHORT).show();
    outState.putInt(TAB_KEY_INDEX, getActionBar()
            .getSelectedNavigationIndex());

}


}

// TabListenr class for managing user interaction with the ActionBar tabs. The
// application context is passed in pass it in constructor, needed for the
// toast.

class MyTabsListener implements ActionBar.TabListener {
public Fragment fragment;
public Context context;

public MyTabsListener(Fragment fragment, Context context) {
this.fragment = fragment;
    this.context = context;

}

@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {
    Toast.makeText(context, "Reselected!", Toast.LENGTH_SHORT).show();

}

@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
    Toast.makeText(context, "Selected!", Toast.LENGTH_SHORT).show();
ft.replace(R.id.fragment_container, fragment);
}

@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
Toast.makeText(context, "Unselected!", Toast.LENGTH_SHORT).show();
    ft.remove(fragment);
}

/**
 * A placeholder fragment containing a simple view.
 */
public static class PlaceholderFragment extends Fragment {


}

@SuppressLint("CutPasteId")
 public void onClick(View v) {

switch(v.getId()) {
case R.id.checkBox1:
     {
        try {
            EditText inputIP = (EditText) findViewById(R.id.editText1);
             String ip = inputIP.getText().toString();

             EditText inputhost = (EditText) findViewById(R.id.editText2);
            int host = Integer.parseInt(inputhost.getText().toString());

            if (inputIP.getText().length() >           &&((inputhost.getText().length()>          0))) {
                send(ip, host );

            }
             else {
                inputIP.setError("Cannot be empty");
                inputhost.setError("Cannot be empty");

              }
        } catch (TException e) {
          //    LOG.error("Sending failed: ", e);
          }

        break;


  }     
    //Show Coordinates
     case R.id.button1:
     {

        LocationProviderService locService = null;
        Location currentLoc = locService.getLastGPSProviderPosition();
         GeographicPointReference gpr = new GeographicPointReference();
        BoundingBox bb = new BoundingBox();

         gpr.setLatitude(currentLoc.getLatitude());
         gpr.setLongitude(currentLoc.getLongitude());

         bb.setUpperright(gpr);
         bb.setLowerleft(gpr);

         TextView tv = new TextView(locService); 
        tv.setText(" "+bb.setLowerleft(gpr)+" ");
        setContentView(tv);

    }
        return;
        }

}

 private void setContentView(TextView tv) {
    // TODO Auto-generated method stub

}

 private EditText findViewById(int edittext1) {
    // TODO Auto-generated method stub
     return null;
}}

包含计时器的 Fragment 是 ChatFragment.java

package com.example.client;

import android.annotation.SuppressLint;
import android.app.Fragment;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.example.uadclient.R;


public class ChatFragment extends Fragment {

    private MalibuCountDownTimer countDownTimer;
    private long timeElapsed;
    private boolean timerHasStarted = false;

    private TextView text;
    private TextView timeElapsedView;

    private final long startTime = 50000;
    private final long interval = 1000;
    private Button buttonTimer;

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


         LinearLayout rr = (LinearLayout) inflater.inflate(R.layout.chatfragment,
            container, false);


      text = (TextView) rr.findViewById(R.id.timer);
      timeElapsedView = (TextView) rr.findViewById(R.id.timeElapsed);



        countDownTimer = new MalibuCountDownTimer(startTime, interval);
        text.setText(text.getText() + String.valueOf(startTime));

        buttonTimer = (Button) rr.findViewById(R.id.button1);

        buttonTimer.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
            Fragment fragment = new FindFragment();
            android.app.FragmentTransaction ft = getFragmentManager()
                    .beginTransaction();

            switch (v.getId()) {

            case R.id.button1:
            {
                if (!timerHasStarted)
                    {
                        countDownTimer.start();
                        timerHasStarted = true;
                        buttonTimer.setText("Start");
                    }
                else
                    {

                        countDownTimer.cancel();
                        timerHasStarted = false;
                        buttonTimer.setText("RESET");
                    }

            }}

        //    ft.commit();
            }


        });



        return rr;
        }

}

还有chatfragment.xml

   <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="0.30"
        android:orientation="vertical" >

      <Button
        android:id="@+id/button"
        android:text="Start"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />
    <TableLayout
        android:padding="10dip"
        android:layout_gravity="center"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content">
        <TableRow>
            <TextView
                android:id="@+id/timer"
                android:text="Time: "
                android:paddingRight="10dip"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />

            <TextView
                android:id="@+id/timeElapsed"
                android:text="Time elapsed: "
                android:paddingRight="10dip"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
        </TableRow>
    </TableLayout>
</LinearLayout>
</LinearLayout>

【问题讨论】:

  • 试试这个public class MainMenuActivity extends ActionBarActivity
  • @MD 他没有使用支持库。
  • 这是哪一行:ActivityThread.java:5356?

标签: android android-actionbar fragment


【解决方案1】:

你应该使用

getFragmentManager().executePendingTransactions(); 确认所有其他事务已完全执行,然后再为片段执行新事务。

有关相同的更多信息,您可以查看问题here

【讨论】:

  • 感谢您的提示!您是指在 MainMenuActivity 内部还是在 Fragment ChatFragment 中?
  • 它应该在你提交一个新的聊天片段之前进入你的MainMenuActivity
猜你喜欢
  • 2021-08-26
  • 1970-01-01
  • 1970-01-01
  • 2016-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多