2013-08-27 127 views
0

我想了解如何實現ActionBarSherlock導航抽屜到項目中。我有一個與官方的Android實施工作,但我希望它運行在2.2以上,所以我正在尋找到ActionBarSherlock。我在代碼的selectItem(int position)部分下有錯誤。我將它貼在這裏:Android - ActionBarSherlock導航抽屜和片段與活動

package com.rufflez.absnavdrawer; 

import com.actionbarsherlock.app.SherlockFragmentActivity; 
import com.actionbarsherlock.view.Menu; 
import com.actionbarsherlock.view.MenuItem; 

import android.content.Intent; 
import android.content.res.Configuration; 
import android.os.Bundle; 
import android.support.v4.app.ActionBarDrawerToggle; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.view.GravityCompat; 
import android.support.v4.widget.DrawerLayout; 
import android.widget.AdapterView; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 

public class MainActivity extends SherlockFragmentActivity { 
private DrawerLayout mDrawerLayout; 
private ListView mDrawerList; 
private ActionBarDrawerToggle mDrawerToggle; 

private CharSequence mDrawerTitle; 
private CharSequence mTitle; 
private String[] mFragmentTitles; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    mTitle = mDrawerTitle = getTitle(); 
    mFragmentTitles = getResources().getStringArray(R.array.fragments); 
    mDrawerLayout = (DrawerLayout)findViewById(R.id.drawer); 
    mDrawerList = (ListView)findViewById(R.id.drawer_list); 

    mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START); 
    mDrawerList.setAdapter(new ArrayAdapter<String>(this, R.layout.drawer_list_item, mFragmentTitles)); 
    mDrawerList.setOnItemClickListener(new DrawerItemClickListener()); 

    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
    getSupportActionBar().setHomeButtonEnabled(true); 

    mDrawerToggle = new ActionBarDrawerToggle(this, 
      mDrawerLayout, 
      R.drawable.ic_drawer, 
      R.string.drawer_open, 
      R.string.drawer_close){ 
     public void onDrawerClosed(View v){ 
      getSupportActionBar().setTitle(mTitle); 
      supportInvalidateOptionsMenu(); 
     } 
     public void onDrawerOpened(View v){ 
      getSupportActionBar().setTitle(mDrawerTitle); 
      supportInvalidateOptionsMenu(); 
     } 
    }; 
    mDrawerLayout.setDrawerListener(mDrawerToggle); 
    if (savedInstanceState == null){ 
     selectItem(0); 
    } 

} 

@Override 
public boolean onPrepareOptionsMenu(Menu menu){ 
    boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList); 
    menu.findItem(R.id.action_settings).setVisible(!drawerOpen); 
    return super.onPrepareOptionsMenu(menu); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getSupportMenuInflater().inflate(R.menu.main, menu); 
    return true; 
} 

public boolean onOptionsItemSelected(MenuItem item){ 
    switch(item.getItemId()){ 
    case android.R.id.home: 
     if (mDrawerLayout.isDrawerOpen(mDrawerList)){ 
      mDrawerLayout.closeDrawer(mDrawerList); 
     } else { 
      mDrawerLayout.openDrawer(mDrawerList); 
     } 
     return true; 
    case R.id.action_settings: 
     Intent i = new Intent(MainActivity.this, Sources.class); 
     startActivity(i); 
     return true; 
    default: 
     return super.onOptionsItemSelected(item); 
    } 
} 

private class DrawerItemClickListener implements ListView.OnItemClickListener{ 
    @Override 
    public void onItemClick(AdapterView<?> parent, View v, int position, long id){ 
     selectItem(position); 
    } 
} 

private void selectItem(int position){ 
    Fragment newFragment = new Fragment_1(); 
    FragmentManager fm = getSupportFragmentManager(); 
    switch(position){ 
    case 0: 
     newFragment = new Fragment_1(); 
     break; 
    case 1: 
     newFragment = new Fragment_2(); 
     break; 
    case 2: 
     newFragment = new Fragment_3(); 
     break; 
    case 3: 
     newFragment = new Fragment_4(); 
     break; 
    case 4: 
     newFragment = new Fragment_5(); 
     break; 
    } 
    fm.beginTransaction() 
    .replace(R.id.content_frame, newFragment) 
    .commit(); 

    mDrawerList.setItemChecked(position, true); 
    setTitle(mFragmentTitles[position]); 
    mDrawerLayout.closeDrawer(mDrawerList); 
} 

@Override 
public void setTitle(CharSequence title){ 
    mTitle = title; 
    getSupportActionBar().setTitle(title); 
} 

@Override 
protected void onPostCreate(Bundle savedInstanceState){ 
    super.onPostCreate(savedInstanceState); 
    mDrawerToggle.syncState(); 
} 

@Override 
public void onConfigurationChanged(Configuration newConfig){ 
    super.onConfigurationChanged(newConfig); 
    mDrawerToggle.onConfigurationChanged(newConfig); 
} 

} 

正如我前面所說,該錯誤是選擇信息下和new Fragment_1();具體錯誤下new Fragment_1();又一遍。日食消息是Type mismatch: cannot convert from Fragment_1 to Fragment

這是Fragment_1.java

package com.rufflez.absnavdrawer; 

import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentActivity; 
import android.content.Intent; 
import android.net.Uri; 
import android.os.Bundle; 
import android.view.View; 
import android.webkit.WebChromeClient; 
import android.webkit.WebView; 
import android.webkit.WebViewClient; 
import android.widget.ProgressBar; 

public class Fragment_1 extends FragmentActivity{ 
WebView webview; 
private String url; 
ProgressBar pd = null; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState);   
    setContentView(R.layout.activity_main); 


    // pd = (ProgressBar) findViewById(R.id.web_view_progress_bar); 

    // webview = (WebView) findViewById(R.id.WebView);  

    webview.setWebChromeClient(new WebChromeClient() { 
     @Override 
     public void onProgressChanged(WebView view, int progress) { 
      if(progress < 100 && pd.getVisibility() == View.GONE){ 
       pd.setVisibility(View.VISIBLE); 
      } 
      pd.setProgress(progress); 
      if(progress == 100) { 
       pd.setVisibility(View.GONE); 
      } 
     } 
    }); 

    webview.setWebViewClient(new WebViewClient() { 
     @Override 
     public boolean shouldOverrideUrlLoading(WebView view, String url){ 
      // do your handling codes here, which url is the requested url 
      // probably you need to open that url rather than redirect: 
      if (url.startsWith("tel:")) { 
       startActivity(new Intent(Intent.ACTION_DIAL, Uri.parse(url))); 
      } else if (url.startsWith("mailto:")) { 
       url = url.replaceFirst("mailto:", ""); 
       url = url.trim(); 
       Intent i = new Intent(Intent.ACTION_SEND); 
       i.setType("plain/text").putExtra(Intent.EXTRA_EMAIL, new String[]{url}); 
       startActivity(i); 



      } else { 
       view.loadUrl(url); 
      } 
      return true; 
      // then it is not handled by default action 
     } 
    }); 


    webview.loadUrl("file:///android_asset/about.html"); 
} 



@Override 
public void onBackPressed() 
{ 
    if(webview.canGoBack()) 
     webview.goBack(); 
    else 
     super.onBackPressed(); 
} 

public void setUrl(String url) { 
    this.url = url; 
} 

public String getUrl() { 
    return url; 
} 
} 

回答

0

我認爲你缺少一個演員,因爲新Fragment_1()將返回類Fragment_1,而不是片段。

0

您的片段是不是一個片段。 將onCreate更改爲onCreateView並執行此代碼;

public class Fragment_1 extends SherlockFragment{ 

我認爲這是錯誤。

如果不行,請嘗試重建片段在這一個

import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 

import com.actionbarsherlock.app.SherlockFragment; 

public class Fragment_1 extends SherlockFragment{ 

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle  savedInstanceState){ 
return inflater.inflate(R.layout.frag1, container, false); 

//改變frag1到相應的XML

} 
}