我正在使用listview共享首选项。.我在互联网上找到了一篇文章,完全适合我的目的...但是问题是.. 我收到了一个错误..并且应用程序崩溃而没有启动活动...
MainActivity.java
public class MainActivity extends AppCompatActivity {
public Toolbar toolbar;
private Fragment contentFragment;
ProductListFragment pdtListFragment;
FavoriteListFragment favListFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
FragmentManager fragmentManager = getSupportFragmentManager();
toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
/*
* This is called when orientation is changed.
*/
if (savedInstanceState != null) {
if (savedInstanceState.containsKey("content")) {
String content = savedInstanceState.getString("content");
if (content.equals(FavoriteListFragment.ARG_ITEM_ID)) {
if (fragmentManager.findFragmentByTag(FavoriteListFragment.ARG_ITEM_ID) != null) {
setFragmentTitle(R.string.favorites);
contentFragment = fragmentManager
.findFragmentByTag(FavoriteListFragment.ARG_ITEM_ID);
}
}
}
if (fragmentManager.findFragmentByTag(ProductListFragment.ARG_ITEM_ID) != null) {
pdtListFragment = (ProductListFragment) fragmentManager
.findFragmentByTag(ProductListFragment.ARG_ITEM_ID);
contentFragment = pdtListFragment;
}
} else {
pdtListFragment = new ProductListFragment();
setFragmentTitle(R.string.app_name);
switchContent(pdtListFragment, ProductListFragment.ARG_ITEM_ID);
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
if (contentFragment instanceof FavoriteListFragment) {
outState.putString("content", FavoriteListFragment.ARG_ITEM_ID);
} else {
outState.putString("content", ProductListFragment.ARG_ITEM_ID);
}
super.onSaveInstanceState(outState);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_favorites:
setFragmentTitle(R.string.favorites);
favListFragment = new FavoriteListFragment();
switchContent(favListFragment, FavoriteListFragment.ARG_ITEM_ID);
return true;
}
return super.onOptionsItemSelected(item);
}
public void switchContent(Fragment fragment, String tag) {
FragmentManager fragmentManager = getSupportFragmentManager();
while (fragmentManager.popBackStackImmediate());
if (fragment != null) {
FragmentTransaction transaction = fragmentManager
.beginTransaction();
transaction.replace(R.id.content_frame, fragment, tag);
//Only FavoriteListFragment is added to the back stack.
if (!(fragment instanceof ProductListFragment)) {
transaction.addToBackStack(tag);
}
transaction.commit();
contentFragment = fragment;
}
}
protected void setFragmentTitle(int resourseId) {
getSupportActionBar().setTitle("my title");
}
@Override
public void onBackPressed() {
FragmentManager fm = getSupportFragmentManager();
if (fm.getBackStackEntryCount() > 0) {
super.onBackPressed();
} else if (contentFragment instanceof ProductListFragment
|| fm.getBackStackEntryCount() == 0) {
finish();
}
}
}
我该如何解决此错误并使代码正常工作。
这是此示例项目的互联网资源 http://androidopentutorials.com/android-how-to-store-list-of-values-in-sharedpreferences/
主xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary">
</android.support.v7.widget.Toolbar>
<FrameLayout
android:layout_below="@+id/toolbar"
android:id="@+id/content_frame"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
清单
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.devmani.mandy.demofavapp">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
样式xml
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- 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>
</resources>
ProductListFragment Java
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.Toast;
public class ProductListFragment extends Fragment implements
OnItemClickListener, OnItemLongClickListener {
public static final String ARG_ITEM_ID = "product_list";
Activity activity;
ListView productListView;
List<Product> products;
ProductListAdapter productListAdapter;
SharedPreference sharedPreference;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
activity = getActivity();
sharedPreference = new SharedPreference();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_product_list, container,
false);
findViewsById(view);
setProducts();
productListAdapter = new ProductListAdapter(activity, products);
productListView.setAdapter(productListAdapter);
productListView.setOnItemClickListener(this);
productListView.setOnItemLongClickListener(this);
return view;
}
private void setProducts() {
Product product1 = new Product(1, "Dell XPS", "Dell XPS Laptop", 60000);
Product product2 = new Product(2, "HP Pavilion G6-2014TX",
"HP Pavilion G6-2014TX Laptop", 50000);
Product product3 = new Product(3, "ProBook HP 4540",
"ProBook HP 4540 Laptop", 45000);
Product product4 = new Product(4, "HP Envy 4-1025TX",
"HP Envy 4-1025TX Laptop", 46000);
Product product5 = new Product(5, "Dell Inspiron",
"Dell Inspiron Laptop", 48000);
Product product6 = new Product(6, "Dell Vostro", "Dell Vostro Laptop",
50000);
Product product7 = new Product(7, "IdeaPad Z Series",
"Lenovo IdeaPad Z Series Laptop", 40000);
Product product8 = new Product(8, "ThinkPad X Series",
"Lenovo ThinkPad X Series Laptop", 38000);
Product product9 = new Product(9, "VAIO S Series",
"Sony VAIO S Series Laptop", 39000);
Product product10 = new Product(10, "Series 5",
"Samsung Series 5 Laptop", 50000);
products = new ArrayList<Product>();
products.add(product1);
products.add(product2);
products.add(product3);
products.add(product4);
products.add(product5);
products.add(product6);
products.add(product7);
products.add(product8);
products.add(product9);
products.add(product10);
}
private void findViewsById(View view) {
productListView = (ListView) view.findViewById(R.id.list_product);
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
Product product = (Product) parent.getItemAtPosition(position);
Toast.makeText(activity, product.toString(), Toast.LENGTH_LONG).show();
}
@Override
public boolean onItemLongClick(AdapterView<?> arg0, View view,
int position, long arg3) {
ImageView button = (ImageView) view.findViewById(R.id.imgbtn_favorite);
String tag = button.getTag().toString();
if (tag.equalsIgnoreCase("grey")) {
sharedPreference.addFavorite(activity, products.get(position));
Toast.makeText(activity,
activity.getResources().getString(R.string.add_favr),
Toast.LENGTH_SHORT).show();
button.setTag("red");
button.setImageResource(R.drawable.heart_red);
} else {
sharedPreference.removeFavorite(activity, products.get(position));
button.setTag("grey");
button.setImageResource(R.drawable.heart_grey);
Toast.makeText(activity,
activity.getResources().getString(R.string.remove_favr),
Toast.LENGTH_SHORT).show();
}
return true;
}
@Override
public void onResume() {
getActivity().getSupportActionBar().setTitle(R.string.app_name);
super.onResume();
}
}
答案 0 :(得分:1)
如果您只想更改标题,请按照Umang的说明进行操作,但是如果您想设置自己的自定义工具栏,则在此活动下的清单中添加以下行:
android:theme="@style/AppTheme.NoActionBar"
希望它对您有用。
答案 1 :(得分:0)
解决方案:
在onCreate()
之前将其写为全局变量:
public Toolbar toolbar;
然后,在onCreate()
之后的setContentView(..)
内部:
toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
然后,代替此:
((Toolbar) findViewById(R.id.toolbar)).setTitle(resourseId);
使用此:
getSupportActionBar().setTitle("My title");
也请删除此setTitle(resourceId)
您的setFragmentTitle(..)
应该如下所示:
private void setFragmentTitle(int resourseId) {
getSupportActionBar().setTitle(resourseId);
}
最后,应用主题styles.xml
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- 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>
</resources>
如果您使用以下命令:((Toolbar) findViewById(R.id.toolbar)).setTitle(resourseId);
,则意味着您要为新的工具栏实例设置标题,而不是使用已经在上面的代码中设置的受支持的操作栏。
希望这会有所帮助。