【问题标题】:AppCompatCallback error on setSupportActionBarsetSupportActionBar 上的 AppCompatCallback 错误
【发布时间】:2015-09-25 09:38:55
【问题描述】:

在这个活动中,我有一个 AppCompatCallback 的实现和一个设置我的工具栏的委托,我有这个东西用于其他 2 个活动并且工作正常,但是在这里我得到了一个错误到 linedelegate1.setSupportActionBar(toolbar).. 我不明白为什么……

import android.app.Activity;
import android.app.AlertDialog;
  import android.content.DialogInterface;
  import android.content.Intent;
   import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
   import android.net.Uri;
 import android.os.Bundle;
     import android.os.Environment;
  import android.support.annotation.Nullable;
    import android.support.v7.app.AppCompatCallback;
 import android.support.v7.app.AppCompatDelegate;
 import android.support.v7.view.ActionMode;
  import android.support.v7.widget.Toolbar;
import android.view.MenuItem;
  import android.view.View;
import android.widget.AdapterView;
 import android.widget.Button;
  import android.widget.EditText;
  import android.widget.GridView;
     import android.widget.TextView;
  import android.widget.Toast;

 import java.io.File;
  import java.io.FileNotFoundException;
   import java.io.FileOutputStream;
  import java.io.InputStream;
  import java.io.OutputStream;
   import java.util.ArrayList;


 public class AlbumActivity extends Activity implements AppCompatCallback {


private final int REQUEST_CODE_CAMERA_IMAGE = 1000;
private final int REQUEST_CODE_EXTERNAL_IMAGE = 2000;
private AppCompatDelegate delegate1;
String nameAlbum;
// Declare variables
private String[] FilePathStrings;
private String[] FileNameStrings;
private File[] listFile;
GridView grid;
GridViewAdapter adapter;
File file;
boolean deleted;


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    delegate1 = AppCompatDelegate.create(this, this);

    //call the onCreate() of the AppCompatDelegate
    delegate1.onCreate(savedInstanceState);

    //use the delegate to inflate the layout
    delegate1.setContentView(R.layout.album_activity);


    Toolbar toolbar = (Toolbar) findViewById(R.id.mytoolbarr);

    delegate1.setSupportActionBar(toolbar);
    delegate1.setTitle("Your Pictures");

    Button btnChoosePicture = (Button) findViewById(R.id.addimage);
    Intent intent = getIntent();
    nameAlbum = intent.getStringExtra("nameAlbum");
    // Check for SD Card
    if (!Environment.getExternalStorageState().equals(
            Environment.MEDIA_MOUNTED)) {
        Toast.makeText(this, "Error! No SDCARD Found!", Toast.LENGTH_LONG)
                .show();
    } else {
        // Locate the image folder in your SD Card
        file = new File(Environment.getExternalStorageDirectory()
                + File.separator + nameAlbum);
        if (file.isDirectory()) {
            listFile = file.listFiles();
            // Create a String array for FilePathStrings
            FilePathStrings = new String[listFile.length];
            // Create a String array for FileNameStrings
            FileNameStrings = new String[listFile.length];

            for (int i = 0; i < listFile.length; i++) {
                // Get the path of the image file
                FilePathStrings[i] = listFile[i].getAbsolutePath();
                // Get the name image file
                FileNameStrings[i] = listFile[i].getName();
            }
        }

        // Locate the GridView in gridview_main.xml
        grid = (GridView) findViewById(R.id.gridview);
        // Pass String arrays to LazyAdapter Class
        adapter = new GridViewAdapter(this, FilePathStrings, FileNameStrings);
        // Set the LazyAdapter to the GridView
        grid.setAdapter(adapter);

        // Capture gridview item click
        grid.setOnItemClickListener(new AdapterView.OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                                    int position, long id) {

                Intent i = new Intent(AlbumActivity.this, ViewImage.class);
                // Pass String arrays FilePathStrings
                i.putExtra("filepath", FilePathStrings);
                // Pass String arrays FileNameStrings
                i.putExtra("filename", FileNameStrings);
                // Pass click position
                i.putExtra("position", position);
                startActivity(i);
            }

        });
        grid.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> parent, final View view, final int position, final long id) {

                AlertDialog.Builder builder = new AlertDialog.Builder(AlbumActivity.this);


                builder.setCancelable(true);
                builder.setMessage("Are you sure you want to delete this picture ?");
                builder.setNeutralButton("Cancel", new DialogInterface.OnClickListener() {

                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.cancel();

                    }

                });
                builder.setPositiveButton("Delete", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {


                        File filepath = Environment.getExternalStorageDirectory();
                        File dir5 = new File(filepath.getAbsolutePath()
                                + nameAlbum+FileNameStrings[position]);

                        File file3 = new File(String.valueOf(dir5));
                       deleted = file3.delete();
adapter.notifyDataSetChanged();
                        finish();
                        startActivity(getIntent());

                        dialog.dismiss();



                    }
                });

                builder.setTitle("Delete Picture");
                AlertDialog dialog = builder.create();
                dialog.show();
                return true;
            }
        });

            }


//select picture from external storage
        btnChoosePicture.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {

                // choose picture from gallery
                Intent PhotoPickerIntent = new Intent(
                        Intent.ACTION_PICK);
                File pictureDirectory = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
                String pictureDirectoryPath = pictureDirectory.getPath();
                Uri data = Uri.parse(pictureDirectoryPath);
                PhotoPickerIntent.setDataAndType(data, "image/*");


                startActivityForResult(PhotoPickerIntent,
                        REQUEST_CODE_EXTERNAL_IMAGE);


            }
        });
    }
@Override

【问题讨论】:

  • 你用过android.support.v7.widget.Toolbar 吗?
  • 是的......但我在其他 2 个活动上使用了相同的小部件,并且一切工作正常......
  • 好的扩展 AppCompatActivity

标签: android


【解决方案1】:

但是在这里我得到了一个错误到delegate1.setSupportActionBar(toolbar)这一行

它可以是两个不同的东西:

您导入了android.widget.Toolbar 而不是 android.support.v7.widget.Toolbar

如果您想使用setSupportActionBar(toolbar),您的Activity 必须扩展AppCompatActivity

如果你扩展AppCompatActivity,你必须使用Theme.AppCompat.Light.NoActionBar

【讨论】:

    【解决方案2】:

    @Skizo 这里一切正常并扩展了 Activity...

    public class EnterDataActivity extends Activity implements AppCompatCallback {
    private AppCompatDelegate delegate;
    EditText editTextPersonName;
    
    
    /**
     * Called when the activity is first created.
     */
    @Override
    public void onCreate(Bundle savedInstanceState) {
    
        super.onCreate(savedInstanceState);
        delegate = AppCompatDelegate.create(this, this);
    
        //call the onCreate() of the AppCompatDelegate
        delegate.onCreate(savedInstanceState);
    
        //use the delegate to inflate the layout
        delegate.setContentView(R.layout.enter_data);
    
        editTextPersonName = (EditText) findViewById(R.id.et_person_name);
        Toolbar toolbar= (Toolbar) findViewById(R.id.mytoolbar2);
    
        delegate.setSupportActionBar(toolbar);
        delegate.setTitle("Enter Album Name");
    
    }
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
    
        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }else if(id==android.R.id.home){
           finish();
        }
    
        return super.onOptionsItemSelected(item);
    }
    
    public void onClickAdd (View btnAdd) {
    
        String personName = editTextPersonName.getText().toString();
    
    
        if ( personName.length() != 0 ) {
    
            Intent newIntent = getIntent();
            newIntent.putExtra("tag_person_name", personName);
    
    
            this.setResult(RESULT_OK, newIntent);
    
            finish();
    
        }
    }
    
    @Override
    public void onSupportActionModeStarted(ActionMode mode) {
    
    }
    
    @Override
    public void onSupportActionModeFinished(ActionMode mode) {
    
    }
    
    @Nullable
    @Override
    public ActionMode onWindowStartingSupportActionMode(ActionMode.Callback callback) {
        return null;
    }
    

    }

    【讨论】:

    • 请告诉我你导入了什么
    • @Skizo ,它有效,但我想知道为什么其他活动与 extends Activity 一起工作得很好......我很困惑
    • 这很奇怪......你确定在你的 EnterDataActivity 中你已经导入了支持库吗?
    • 顺便说一句,如果我帮助您解决了您的问题,请随时将我的答案标记为正确:D
    • @Skizo 看看这个link,和我对我的活动所做的一样,但我不知道为什么不使用 extends Activity,如果我要改变我的活动 extends AppCompatActivity我必须对我的项目进行一些更改,我有点懒:))
    【解决方案3】:

    我确实解决了我的问题,我必须在我的活动布局中包含我的工具栏布局...谢谢大家有兴趣解决我的问题!

    【讨论】:

      猜你喜欢
      • 2015-03-24
      • 2015-05-15
      • 2018-10-30
      • 2015-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-10
      相关资源
      最近更新 更多