在Android应用中添加工具栏

时间:2016-08-07 15:59:49

标签: android-layout listview android-studio android-fragments

我想在我的Android应用程序中添加工具栏,但是在我的应用程序在git上运行后,我在StudentDashboardActivity.java中收到此错误。我无法找到它背后的问题。

FATAL EXCEPTION: main
              Process: com.technerdshub.vusocial, PID: 31319
              java.lang.RuntimeException: Unable to start activity ComponentInfo{com.technerdshub.vusocial/com.technerdshub.vusocial.Activities.StudentDashboardActivity}: java.lang.IllegalStateException: This Activity already has an action bar supplied by the window decor. Do not request Window.FEATURE_SUPPORT_ACTION_BAR and set windowActionBar to false in your theme to use a Toolbar instead.
              at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2693)
              at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2758)
              at android.app.ActivityThread.access$900(ActivityThread.java:177)
              at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1448)
              at android.os.Handler.dispatchMessage(Handler.java:102)
              at android.os.Looper.loop(Looper.java:145)
              at android.app.ActivityThread.main(ActivityThread.java:5942)
              at java.lang.reflect.Method.invoke(Native Method)
              at java.lang.reflect.Method.invoke(Method.java:372)
              at

              com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1389)
              at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1184)
              Caused by: java.lang.IllegalStateException: This Activity already has an action bar supplied by the window decor. Do not request Window.FEATURE_SUPPORT_ACTION_BAR and set windowActionBar to false in your theme to use a Toolbar instead.
              at android.support.v7.app.AppCompatDelegateImplV7.setSupportActionBar(AppCompatDelegateImplV7.java:198)
              at android.support.v7.app.AppCompatActivity.setSupportActionBar(AppCompatActivity.java:130)
              at com.technerdshub.vusocial.Activities.StudentDashboardActivity.onCreate(StudentDashboardActivity.java:51)
              at android.app.Activity.performCreate(Activity.java:6289)

StudentDashboardActivity.java

package com.technerdshub.vusocial.Activities;

    import android.app.Activity;
    import android.content.Intent;
    import android.net.Uri;
    import android.os.Bundle;
    import android.support.design.widget.TabLayout;
    import android.support.v4.app.FragmentManager;
    import android.support.v4.app.FragmentPagerAdapter;
    import android.support.v4.view.ViewPager;
    import android.support.v7.app.ActionBarActivity;
    import android.support.v7.widget.Toolbar;
    import android.support.v7.app.AppCompatActivity;
    import android.support.v7.widget.Toolbar;

    import com.google.android.gms.appindexing.Action;
    import com.google.android.gms.appindexing.AppIndex;
    import com.google.android.gms.common.api.GoogleApiClient;
    import com.technerdshub.vusocial.Fragments.TaskFragment;
    import com.technerdshub.vusocial.Fragments.dummy.DummyContent;
    import com.technerdshub.vusocial.R;

    import java.util.ArrayList;
    import java.util.List;

    public class StudentDashboardActivity extends AppCompatActivity {

        private Toolbar toolbar;
        private TabLayout tabLayout;
        private ViewPager viewPager;
        /**
         * ATTENTION: This was auto-generated to implement the App Indexing API.
         * See https://g.co/AppIndexing/AndroidStudio for more information.
         */
        private GoogleApiClient client;

        @Override
        protected void onCreate(Bundle savedInstanceState) {

            displayLoginActivity();

            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_student_dashboard);

    //        Parse.initialize(new Parse.Configuration.Builder(this)
    //                        .applicationId("J5CIV2z6xeSCXDqdOfhE0kPSikvRFPyDyOJxqJNx")
    //                        .clientKey("bEWm4nWtWiBrMczGfOvA7s4Ulr2bAU3W3TtVSLDf")
    //                        .build()
    //        );
            toolbar = (Toolbar) findViewById(R.id.tool_bar);
            setSupportActionBar(toolbar);

            getSupportActionBar().setDisplayHomeAsUpEnabled(true);
            getSupportActionBar().setElevation(2);


            viewPager = (ViewPager) findViewById(R.id.viewpager);
            setupViewPager(viewPager);

            tabLayout = (TabLayout) findViewById(R.id.tabs);
            tabLayout.setupWithViewPager(viewPager);

    //        ParseObject testObject = new ParseObject("Task");
    //        testObject.put("marks", 99);
    //        testObject.saveInBackground();

            // ATTENTION: This was auto-generated to implement the App Indexing API.
            // See https://g.co/AppIndexing/AndroidStudio for more information.
            client = new GoogleApiClient.Builder(this).addApi(AppIndex.API).build();
        }

        private void setupViewPager(ViewPager viewPager) {
            ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
            adapter.addFragment(new TaskFragment(), "Quiz");
            adapter.addFragment(new TaskFragment(), "Assignment");
            adapter.addFragment(new TaskFragment(), "GDB");
            viewPager.setAdapter(adapter);
        }



        private void displayLoginActivity() {

            Intent i = new Intent(this, Login.class);
            startActivity(i);

        }

        @Override
        public void onStart() {
            super.onStart();

            // ATTENTION: This was auto-generated to implement the App Indexing API.
            // See https://g.co/AppIndexing/AndroidStudio for more information.
            client.connect();
            Action viewAction = Action.newAction(
                    Action.TYPE_VIEW, // TODO: choose an action type.
                    "StudentDashboard Page", // TODO: Define a title for the content shown.
                    // TODO: If you have web page content that matches this app activity's content,
                    // make sure this auto-generated web page URL is correct.
                    // Otherwise, set the URL to null.
                    Uri.parse("http://host/path"),
                    // TODO: Make sure this auto-generated app URL is correct.
                    Uri.parse("android-app://com.technerdshub.vusocial.Activities/http/host/path")
            );
            AppIndex.AppIndexApi.start(client, viewAction);
        }

        @Override
        public void onStop() {
            super.onStop();

            // ATTENTION: This was auto-generated to implement the App Indexing API.
            // See https://g.co/AppIndexing/AndroidStudio for more information.
            Action viewAction = Action.newAction(
                    Action.TYPE_VIEW, // TODO: choose an action type.
                    "StudentDashboard Page", // TODO: Define a title for the content shown.
                    // TODO: If you have web page content that matches this app activity's content,
                    // make sure this auto-generated web page URL is correct.
                    // Otherwise, set the URL to null.
                    Uri.parse("http://host/path"),
                    // TODO: Make sure this auto-generated app URL is correct.
                    Uri.parse("android-app://com.technerdshub.vusocial.Activities/http/host/path")
            );
            AppIndex.AppIndexApi.end(client, viewAction);
            client.disconnect();
        }

        class ViewPagerAdapter extends FragmentPagerAdapter {
            private final List<TaskFragment> mFragmentList = new ArrayList<>();
            private final List<String> mFragmentTitleList = new ArrayList<>();

            public ViewPagerAdapter(FragmentManager manager) {
                super(manager);
            }

            @Override
            public TaskFragment getItem(int position) {
                return mFragmentList.get(position);
            }

            @Override
            public int getCount() {
                return mFragmentList.size();
            }

            public void addFragment(TaskFragment fragment, String title) {
                mFragmentList.add(fragment);
                mFragmentTitleList.add(title);
            }

            @Override
            public CharSequence getPageTitle(int position) {
                return mFragmentTitleList.get(position);
            }


        }

    }

style.xml

<resources xmlns:tools="http://schemas.android.com/tools">

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/ColorPrimary</item>
        <item name="colorPrimaryDark">@color/ColorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>



    </style>

    <!--<style name="AppTheme.NoActionBar" parent="Theme.AppCompat.NoActionBar">-->
        <!--<item name="windowActionBar">false</item>-->
        <!--<item name="windowNoTitle">true</item>-->



    <!--</style>-->

    <style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" >

    </style>

    <style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" />

    <style name="TEST" parent="AppTheme" >
        <item name="colorPrimary">@color/com_facebook_blue</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="android:colorBackground">@color/cardview_light_background</item>
        <item name="colorPrimaryDark">@color/com_facebook_button_background_color_selected</item>
    </style>


    <!--&lt;!&ndash; new design fai&ndash;&gt;-->
    <!--<style name="MyMaterialTheme" parent="MyMaterialTheme.Base">-->

    <!--</style>-->

    <!--<style name="MyMaterialTheme.Base" parent="Theme.AppCompat.Light.NoActionBar">-->
        <!--<item name="windowNoTitle">true</item>-->
        <!--<item name="windowActionBar">false</item>-->
        <!--<item name="colorPrimary">@color/colorPrimary</item>-->
        <!--<item name="colorPrimaryDark">@color/colorPrimaryDark</item>-->
        <!--<item name="colorAccent">@color/colorAccent</item>-->
    <!--</style>-->


</resources>

请告诉我,我该如何解决此错误?

2 个答案:

答案 0 :(得分:1)

在style.xml

中将windowActionBar的app主题声明为false
 <item name="windowNoTitle">true</item>

如果您已经使用任何应用支持库,主题还需要包含在下面的行

var usernames = [String]()
var sentDate = [NSDate]()
var details = [String]()
var userImage = [PFFile]()


@IBAction func backToProfile(sender: AnyObject) {
    self.performSegueWithIdentifier("messagesToProfile", sender: self)
}


override func viewDidLoad() {
    super.viewDidLoad()

    let messagesQuery = PFQuery(className: "Messages")
    messagesQuery.whereKey("recipientId", equalTo: PFUser.currentUser()!.objectId!)
    messagesQuery.includeKey("senderId")
    messagesQuery.orderByDescending("createdAt")
    messagesQuery.findObjectsInBackgroundWithBlock({ (objects, error) -> Void in

        if error != nil {
            print(error)
        }

        if error == nil {

            if let objects = objects {

                self.usernames.removeAll(keepCapacity: true)
                self.sentDate.removeAll(keepCapacity: true)
                self.details.removeAll(keepCapacity: true)
                self.userImage.removeAll(keepCapacity: true)

                for object in objects {

                    self.sentDate.append(object.createdAt! as NSDate)

                    if (object["item"] != nil) {
                    self.details.append(object["item"] as! String)
                    } else {
                    self.details.append(object["request"] as! String)
                    }

                    let senderObject = (object["senderId"] as! PFUser)
                    let senderId = (senderObject.objectId! as String)

                    print(senderId)

                    // Query for sender info
                    let userQuery = PFUser.query()
                    userQuery?.whereKey("objectId", equalTo: senderId)
                    userQuery?.getFirstObjectInBackgroundWithBlock({ (object, error) in

                        self.usernames.append((object!["username"] as! String))

                        //self.userImage.append(object!["profilePicture"] as! PFFile)

                    })




                }

                dispatch_async(dispatch_get_main_queue()) {
                    self.tableView.reloadData()
                    //self.search.resignFirstResponder()
                }
            }


    }
    })

    // Uncomment the following line to preserve selection between presentations
    // self.clearsSelectionOnViewWillAppear = false

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
    // self.navigationItem.rightBarButtonItem = self.editButtonItem()
}


override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}


// MARK: - Table view data source

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    // #warning Incomplete implementation, return the number of sections
    return 1
}


override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // #warning Incomplete implementation, return the number of rows
    return sentDate.count
}


override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("messageCell", forIndexPath: indexPath) as! MessageTableViewCell

    //print(usernames[indexPath.row])
    cell.senderUsername.text = usernames[indexPath.row]
    cell.itemOrPreview.text = details[indexPath.row]

    let date = sentDate[indexPath.row]
    let formatter = NSDateFormatter()
    formatter.dateStyle = NSDateFormatterStyle.LongStyle
    formatter.timeStyle = .ShortStyle
    let dateString = formatter.stringFromDate(date)
    cell.sentDate.text = dateString


    //userImage[indexPath.row].getDataInBackgroundWithBlock { (data, error) in
      //  if let downloadedItemImage = UIImage(data: data!) {
        //    cell.senderImage?.image = downloadedItemImage
        //}
    //}


    return cell
}

override func viewWillAppear(animated: Bool) {
    tableView.reloadData()
}

答案 1 :(得分:1)

尝试将style.xml更改为下面的代码

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <!-- Customize your theme here. -->
    <item name="android:windowActionBar">false</item>
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
</style>

<style name="AppTheme.NoActionBar">
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
</style>