2015-04-30 35 views
1

我試圖設計一個儀表盤爲我的Android應用程序以指導從以下鏈接:儀表盤不顯示圖標的android

http://www.androidhive.info/2011/12/android-dashboard-design-tutorial/ 

但我面臨的問題是,圖標不顯示得到。我設置了藍色活動背景顏色的空白顯示。但儀表板圖標不顯示。我的代碼是這樣的:

.class文件:

package kanix.highrise.com.db; 

import android.app.Activity; 
import android.content.Intent; 
import android.support.v7.app.ActionBarActivity; 
import android.os.Bundle; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.Button; 


public class AndroidDashboardDesignActivity extends Activity { 

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

     /** 
     * Creating all buttons instances 
     * */ 
     // Dashboard News feed button 
     Button btn_newsfeed = (Button) findViewById(R.id.btn_news_feed); 

     // Dashboard Friends button 
     Button btn_friends = (Button) findViewById(R.id.btn_friends); 

     // Dashboard Messages button 
     Button btn_messages = (Button) findViewById(R.id.btn_messages); 

     // Dashboard Places button 
     Button btn_places = (Button) findViewById(R.id.btn_places); 

     // Dashboard Events button 
     Button btn_events = (Button) findViewById(R.id.btn_events); 

     // Dashboard Photos button 
     Button btn_photos = (Button) findViewById(R.id.btn_photos); 

     /** 
     * Handling all button click events 
     * */ 

     // Listening to News Feed button click 
     btn_newsfeed.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View view) { 
       // Launching News Feed Screen 
       // Intent i = new Intent(getApplicationContext(), NewsFeedActivity.class); 
       // startActivity(i); 
      } 
     }); 

     // Listening Friends button click 
     btn_friends.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View view) { 
       // Launching News Feed Screen 
      // Intent i = new Intent(getApplicationContext(), FriendsActivity.class); 
      // startActivity(i); 
      } 
     }); 

     // Listening Messages button click 
     btn_messages.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View view) { 
       // Launching News Feed Screen 
      // Intent i = new Intent(getApplicationContext(), MessagesActivity.class); 
      // startActivity(i); 
      } 
     }); 

     // Listening to Places button click 
     btn_places.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View view) { 
       // Launching News Feed Screen 
       // Intent i = new Intent(getApplicationContext(), PlacesActivity.class); 
       // startActivity(i); 
      } 
     }); 

     // Listening to Events button click 
     btn_events.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View view) { 
       // Launching News Feed Screen 
       // Intent i = new Intent(getApplicationContext(), EventsActivity.class); 
       // startActivity(i); 
      } 
     }); 

     // Listening to Photos button click 
     btn_photos.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View view) { 
       // Launching News Feed Screen 
      // Intent i = new Intent(getApplicationContext(), PhotosActivity.class); 
       // startActivity(i); 
      } 
     }); 
    } 
    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.menu_android_dashboard_design, menu); 
     return true; 
    } 

    @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; 
     } 

     return super.onOptionsItemSelected(item); 
    } 
} 

另一個類

package kanix.highrise.com.db; 

import android.content.Context; 
import android.util.AttributeSet; 
import android.view.View; 
import android.view.ViewGroup; 

/** 
* Created by Mubashir.gul on 30/04/2015. 
*/ 
public class DashboardLayout extends ViewGroup { 

    private static final int UNEVEN_GRID_PENALTY_MULTIPLIER = 10; 

    private int mMaxChildWidth = 0; 
    private int mMaxChildHeight = 0; 

    public DashboardLayout(Context context) { 
     super(context, null); 
    } 

    public DashboardLayout(Context context, AttributeSet attrs) { 
     super(context, attrs, 0); 
    } 

    public DashboardLayout(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
    } 

    @Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
     mMaxChildWidth = 0; 
     mMaxChildHeight = 0; 

     // Measure once to find the maximum child size. 

     int childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(
       MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.AT_MOST); 
     int childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(
       MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.AT_MOST); 

     final int count = getChildCount(); 
     for (int i = 0; i < count; i++) { 
      final View child = getChildAt(i); 
      if (child.getVisibility() == GONE) { 
       continue; 
      } 

      child.measure(childWidthMeasureSpec, childHeightMeasureSpec); 

      mMaxChildWidth = Math.max(mMaxChildWidth, child.getMeasuredWidth()); 
      mMaxChildHeight = Math.max(mMaxChildHeight, child.getMeasuredHeight()); 
     } 

     // Measure again for each child to be exactly the same size. 

     childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(
       mMaxChildWidth, MeasureSpec.EXACTLY); 
     childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(
       mMaxChildHeight, MeasureSpec.EXACTLY); 

     for (int i = 0; i < count; i++) { 
      final View child = getChildAt(i); 
      if (child.getVisibility() == GONE) { 
       continue; 
      } 

      child.measure(childWidthMeasureSpec, childHeightMeasureSpec); 
     } 

     setMeasuredDimension(
       resolveSize(mMaxChildWidth, widthMeasureSpec), 
       resolveSize(mMaxChildHeight, heightMeasureSpec)); 
    } 

    @Override 
    protected void onLayout(boolean changed, int l, int t, int r, int b) { 
     int width = r - l; 
     int height = b - t; 

     final int count = getChildCount(); 

     // Calculate the number of visible children. 
     int visibleCount = 0; 
     for (int i = 0; i < count; i++) { 
      final View child = getChildAt(i); 
      if (child.getVisibility() == GONE) { 
       continue; 
      } 
      ++visibleCount; 
     } 

     if (visibleCount == 0) { 
      return; 
     } 

     // Calculate what number of rows and columns will optimize for even horizontal and 
     // vertical whitespace between items. Start with a 1 x N grid, then try 2 x N, and so on. 
     int bestSpaceDifference = Integer.MAX_VALUE; 
     int spaceDifference; 

     // Horizontal and vertical space between items 
     int hSpace = 0; 
     int vSpace = 0; 

     int cols = 1; 
     int rows; 

     while (true) { 
      rows = (visibleCount - 1)/cols + 1; 

      hSpace = ((width - mMaxChildWidth * cols)/(cols + 1)); 
      vSpace = ((height - mMaxChildHeight * rows)/(rows + 1)); 

      spaceDifference = Math.abs(vSpace - hSpace); 
      if (rows * cols != visibleCount) { 
       spaceDifference *= UNEVEN_GRID_PENALTY_MULTIPLIER; 
      } 

      if (spaceDifference < bestSpaceDifference) { 
       // Found a better whitespace squareness/ratio 
       bestSpaceDifference = spaceDifference; 

       // If we found a better whitespace squareness and there's only 1 row, this is 
       // the best we can do. 
       if (rows == 1) { 
        break; 
       } 
      } else { 
       // This is a worse whitespace ratio, use the previous value of cols and exit. 
       --cols; 
       rows = (visibleCount - 1)/cols + 1; 
       hSpace = ((width - mMaxChildWidth * cols)/(cols + 1)); 
       vSpace = ((height - mMaxChildHeight * rows)/(rows + 1)); 
       break; 
      } 

      ++cols; 
     } 

     // Lay out children based on calculated best-fit number of rows and cols. 

     // If we chose a layout that has negative horizontal or vertical space, force it to zero. 
     hSpace = Math.max(0, hSpace); 
     vSpace = Math.max(0, vSpace); 

     // Re-use width/height variables to be child width/height. 
     width = (width - hSpace * (cols + 1))/cols; 
     height = (height - vSpace * (rows + 1))/rows; 

     int left, top; 
     int col, row; 
     int visibleIndex = 0; 
     for (int i = 0; i < count; i++) { 
      final View child = getChildAt(i); 
      if (child.getVisibility() == GONE) { 
       continue; 
      } 

      row = visibleIndex/cols; 
      col = visibleIndex % cols; 

      left = hSpace * (col + 1) + width * col; 
      top = vSpace * (row + 1) + height * row; 

      child.layout(left, top, 
        (hSpace == 0 && col == cols - 1) ? r : (left + width), 
        (vSpace == 0 && row == rows - 1) ? b : (top + height)); 
      ++visibleIndex; 
     } 
    } 
} 

我的XML文件是這樣的:

actionbar_layout.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" style="@style/ActionBarCompat" 


    > 

    <ImageView 
     android:layout_width="wrap_content" 
     android:layout_height="fill_parent" 
     android:clickable="false" 
     android:paddingLeft="15dip" 
     android:scaleType="center" 
     /> 
     /> 
</LinearLayout> 

dashboard_l ayout.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/home_root" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
    <!-- Include Action Bar --> 
    <include layout="@layout/actionbar_layout"/> 

    <!-- Include Fragmented dashboard --> 
    <include layout="@layout/fragment_layout"/> 

    <!-- Include Footer --> 
    <include layout="@layout/footer_layout"/> 

</LinearLayout> 

fragment_layout.xml

<?xml version="1.0" encoding="utf-8"?> 
<kanix.highrise.com.db.DashboardLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" android:layout_height="match_parent"> 
    <Button 
     android:id="@+id/btn_news_feed" 
     style="@style/DashboardButton" 
     android:drawableTop="@mipmap/works" 
     android:text="News Feed" /> 

    <!-- Friends Button --> 
    <Button 
     android:id="@+id/btn_friends" 
     style="@style/DashboardButton" 
     android:drawableTop="@mipmap/works" 
     android:text="Friends" 
     android:textColor="#fff"/> 

    <!-- Messages Button --> 
    <Button 
     android:id="@+id/btn_messages" 
     style="@style/DashboardButton" 
     android:drawableTop="@mipmap/works" 
     android:text="Messages" /> 

    <!-- Places Button --> 
    <Button 
     android:id="@+id/btn_places" 
     style="@style/DashboardButton" 
     android:drawableTop="@mipmap/works" 
     android:text="Places" /> 

    <!-- Events Button --> 
    <Button 
     android:id="@+id/btn_events" 
     style="@style/DashboardButton" 
     android:drawableTop="@mipmap/works" 
     android:text="Events" /> 

    <!-- Photos Button --> 
    <Button 
     android:id="@+id/btn_photos" 
     style="@style/DashboardButton" 
     android:drawableTop="@mipmap/works" 
     android:text="Photos" /> 
</kanix.highrise.com.db.DashboardLayout> 

footer_layout.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" style="@style/FooterBar" > 
    <TextView android:text="www.facebook.com" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:textColor="#606060" 
     android:gravity="center" 
     android:paddingTop="10dip"/> 
</LinearLayout> 

我Styles.xml文件是這樣的:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <style name="ActionBarCompat"> 
     <item name="android:layout_width">fill_parent</item> 
     <item name="android:layout_height">50dp</item> 
     <item name="android:orientation">horizontal</item> 
     <item name="android:background">#2E5EA3</item> 
    </style> 

    <style name="DashboardButton"> 
     <item name="android:layout_gravity">center_vertical</item> 
     <item name="android:layout_width">wrap_content</item> 
     <item name="android:layout_height">wrap_content</item> 
     <item name="android:gravity">center_horizontal</item> 
     <item name="android:drawablePadding">2dp</item> 
     <item name="android:textSize">16dp</item> 
     <item name="android:textStyle">bold</item> 
     <item name="android:textColor">#fff</item> 
     <item name="android:background">@null</item> 
    </style> 

    <style name="FooterBar"> 
     <item name="android:layout_width">fill_parent</item> 
     <item name="android:layout_height">40dp</item> 
     <item name="android:orientation">horizontal</item> 
     <item name="android:background">#dedede</item> 
    </style> 

</resources> 

我不知道在哪裏我做錯了這麼多事情。此外,我在所有圖標上使用相同的圖像。

回答

1

圖標沒有顯示,因爲您可能沒有保存圖像在可繪製文件夾內。

請參閱,android:drawableTop="@drawable/btn_newsfeed"此代碼表示會有「newsfeed」圖標,位於文本「News Feed」上方。 您必須將圖像文件保存在名稱爲btn_newsfeed的可繪製文件夾內,對於其他Button圖像也同樣如此。

<Button 
     android:id="@+id/btn_news_feed" 
     style="@style/DashboardButton" 
     android:drawableTop="@drawable/btn_newsfeed" 
     android:text="News Feed" /> 

希望這會幫助你,如果它不清楚,你可以評論和問。

+0

Thx苛刻..但如果我已將我的圖標保存在@mmapmap文件夾中..我的問題是如何給這個路徑 – killer

+0

現在我也把我的works.png圖標放在可繪製的文件夾中,並改變了這樣的路徑android:drawableTop =「@ drawable/works」但它仍然沒有顯示圖標 – killer

+0

在minmap的情況下,你可以給這樣的路徑@ mipmap/